c++ - 在不断增长的 vector 中返回对元素的引用是不好的做法吗?

标签 c++ pointers vector reference move

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

我的理解是 std::vector 应该将其内容 move 到内存中,因为它保证会继续,对吗?我认为我可以通过传递一个 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?

最佳答案

当 vector 需要重新分配其存储时,位于“旧”位置的对象在被复制(或 move 到)新存储后将被删除。 move 不会将对象“传送”到新位置,它仍在新位置创建新对象。

您持有的引用引用了已被 vector 重新分配操作删除的“旧”对象。使用该引用将导致未定义的行为。与指针情况相同。您也不能存储迭代器,它们也会失效。

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

关于c++ - 在不断增长的 vector 中返回对元素的引用是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967948/

相关文章:

c++ - 取消引用窗口对象时 Gtkmm 应用程序崩溃

c++ - 使用 decltype 返回迭代器

c++ - 为什么有时人们更喜欢 strtoll 而不是 strtol,即使他们只想将字符串转换为 int32?

c - 矩阵幂和指针

c++ - 数组和指针有问题

c++ - 使用步骤 c++ 构建 vector

c++ - 如何获得字符串字符的正确索引?

c++ - 如何完全删除二维指针数组

c++ - 用户定义类的构造函数不适用于 vector

c++ - 将 vector <int> 转换为字符串