在相同的内存地址处不需要地创建对象

时间:2012-11-10 19:37:02

标签: c++ arrays pointers memory

我已经很长时间没有使用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++;
}

但问题仍然存在。

任何提示?,我的代码(或思考)中的错误/错误?我应该实现一些"复制构造函数"?

1 个答案:

答案 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(...)));
}