在同一内存地址创建不需要的对象 我很久没有用C++工作了,现在我需要做一些小项目。 我复习了几个主题,试图找到解决问题的方法,但没有结果

在同一内存地址创建不需要的对象 我很久没有用C++工作了,现在我需要做一些小项目。 我复习了几个主题,试图找到解决问题的方法,但没有结果,c++,arrays,pointers,memory,C++,Arrays,Pointers,Memory,下面是我的类的伪代码对: Pair** pairs; 我从输入中获取表的大小,并创建指针表: pairs = new Pair*[size]; Pair* clearPairs = new Pair[size]; while (...) { clearPairs[i] = Pair(...); pairs[i] = &clearPairs[i]; i++; } 我有一个循环,它创建一些对象并将其引用放入指针表中。或多或少: while (...) {

下面是我的类的伪代码对:

Pair** pairs;
我从输入中获取表的大小,并创建指针表:

pairs = new Pair*[size];
Pair* clearPairs = new Pair[size];
while (...)
{
    clearPairs[i] = Pair(...);
    pairs[i] = &clearPairs[i];
    i++;
}
我有一个循环,它创建一些对象并将其引用放入指针表中。或多或少:

while (...)
{
    Pair pair(...); // calling constructor, creating object type of Pair.
    pairs[i] = &pair;
    i++;
}
问题是&对每次循环的每一步都是相同的数字。 假设第一个创建的对象的地址是1234。 因此,循环中的每一步都会在1234处覆盖该对象。因此,成对的每个指针都指向相同的地址->相同的对象。 我想强制在内存中的新位置创建此对象

我一直在尝试将这些对象放入其他表中,然后将它们的引用传递给指针表:

pairs = new Pair*[size];
Pair* clearPairs = new Pair[size];
while (...)
{
    clearPairs[i] = Pair(...);
    pairs[i] = &clearPairs[i];
    i++;
}
但问题仍然存在

我的代码或思维中有任何提示、错误/错误吗?我应该实现一些复制构造函数吗

while (...)
{
    Pair pair(...); // calling constructor, creating object type of Pair.
    pairs[i] = &pair;
    i++;
}
对分配了自动存储持续时间,并在循环的每次迭代时超出范围。您正在将指向无效对象的指针保存为一组指针

如果确实需要指针,则应该使用智能指针的集合。当对象无法复制或复制成本很高时,这一点是正确的,因为复制可能根本不需要。请尝试以下方法:

vector<Pair> pairs;
// and if you need pointers...
vector<unique_ptr<Pair>> pairs;

while(whatever) {
    pairs.push_back(Pair(...));
    // or...
    pairs.push_back(unique_ptr<Pair>(new Pair(...)));
}
对分配了自动存储持续时间,并在循环的每次迭代时超出范围。您正在将指向无效对象的指针保存为一组指针

如果确实需要指针,则应该使用智能指针的集合。当对象无法复制或复制成本很高时,这一点是正确的,因为复制可能根本不需要。请尝试以下方法:

vector<Pair> pairs;
// and if you need pointers...
vector<unique_ptr<Pair>> pairs;

while(whatever) {
    pairs.push_back(Pair(...));
    // or...
    pairs.push_back(unique_ptr<Pair>(new Pair(...)));
}

你不是在while循环中使用本地地址吗。更喜欢每次循环时在堆上创建新对象,而不是在while循环中获取本地地址。我更喜欢每次循环都在堆上创建新对象,好吧,但我仍然不知道为什么我把这个pair对象放在单独的表中是错误的?假设pair类似于std::pair,即一个键和一个值,也可以使用std::map,但我在这里猜测。Eds的答案很好。我认为当使用向量时,我无法访问特定位置的对象,即对[3]。任务是实现heap,所以我宁愿需要该选项,也需要为表中的元素分配NULL。但我可能错了……例如,您可以像使用数组和访问对[3]一样使用std::vector。此外,还可以添加空元素。无论如何,如果只需要添加固定数量的项,可以使用数组too@Daniel卡斯特罗,谢谢。我只是在做一些关于向量的研究,还发现了信息;。不幸的是,数组的大小是动态的,用户输入大小。好吧,但我仍然不知道为什么我把这个pair对象放在单独的表中是错误的?假设pair类似于std::pair,即一个键和一个值,您也可以使用std::map-但我在这里猜测。Eds的答案很好。我认为当使用向量时,我无法访问特定位置的对象,即对[3]。任务是实现heap,所以我宁愿需要该选项,也需要为表中的元素分配NULL。但我可能错了……例如,您可以像使用数组和访问对[3]一样使用std::vector。此外,还可以添加空元素。无论如何,如果只需要添加固定数量的项,可以使用数组too@Daniel卡斯特罗,谢谢。我只是在做一些关于向量的研究,还发现了信息;。不幸的是,数组的大小是动态的,用户输入大小。