在不断增长的向量不良实践中返回对元素的引用?

时间:2014-05-31 08:19:45

标签: c++ pointers vector reference move

我遇到了一个奇怪的内存错误(segfault)。经过一些代码审查后,我发现我将指向self(this)的指针传递给一个类中的成员值,该类本身位于一个向量内,并且它将要更改其地址。然后(可能)向量增长,刚刚通过的指针变为无效。

我的理解是std::vector应该将其内容移到内存中,因为它保证会继续,对吧?我认为我可以通过传递const引用而不是指针(传递*this)来克服这个问题。但我有同样的段错误。我不明白为什么引用会像指针一样变得无效!情况可以总结如下:

class Foo
{
public:
    Foo(): x(new Bar(*this)){}
    Foo(Foo&&);
    Foo& operator=(Foo&&)
private:
    // some heavy to move data
    Bar* x;
};

class Bar
{
public:
    Bar(const Foo& foo): instance(foo){}
private:
    const Foo& instance;
};

std::vector<Zoo> vec;
// Do some stuff on vec, then x->instance become invalid. Why?

1 个答案:

答案 0 :(得分:2)

当向量需要重新分配其存储空间时,生存在&#34; old&#34;位置在被复制(或移入)新存储后被删除。此举不会传送&#34;如果是新位置的对象,它仍然会在新位置创建新对象。

您持有的引用引用了&#34; old&#34;已由向量重新分配操作删除的对象。使用该引用将导致未定义的行为。与指针大小写相同。你也不能存储迭代器,那些也是无效的。

您需要找到另一种方法来跟踪该元素。具体如何做到这一点取决于你想要做什么。有时只保留索引就足够了。