我已经很长时间没有使用C ++了,现在我需要做一些小型项目"。
我查看了几个主题,试图找到我的问题的解决方案而没有结果......
这是"伪代码" (Pair
是我的班级):
Pair** pairs;
我从输入中获取表的大小并创建指针表:
pairs = new Pair*[size];
我有一个循环,它创建一些对象并将其引用到指针表中。或多或少:
while (...)
{
Pair pair(...); // calling constructor, creating object type of Pair.
pairs[i] = &pair;
i++;
}
问题是&pair
每次都是相同的数字(循环的每一步)。
让我们说第一个创建的对象的地址是1234。
因此,对于循环中的每个步骤,它将在1234处覆盖此对象。因此pairs
中的每个指针指向相同的地址 - >同一个对象。
我想在内存中的新位置强制创建此对象。
我一直试图将这些对象放到其他表中,然后将它们的引用传递给指针表:
Pair* clearPairs = new Pair[size];
while (...)
{
clearPairs[i] = Pair(...);
pairs[i] = &clearPairs[i];
i++;
}
但问题仍然存在。
任何提示?,我的代码(或思考)中的错误/错误?我应该实现一些"复制构造函数"?
答案 0 :(得分:4)
while (...)
{
Pair pair(...); // calling constructor, creating object type of Pair.
pairs[i] = &pair;
i++;
}
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(...)));
}