1

我很久没有使用 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++;
}

但问题仍然存在。

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

4

1 回答 1

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(...)));
}
于 2012-11-10T19:41:02.053 回答