c++ - 如果重新分配链表会发生什么

标签 c++

我知道如果你压入的元素多于它的容量, vector 会被移动,但是如果其中一个元素因为与列表本身无关的原因而被移动,std::list 会发生什么?例如为 vector 腾出空间? 列表会因为移动元素周围的元素不再指向它而失效吗?还是为这种情况准备了 list ?

如果是后者,指向被移动元素的指针会怎样?

对于案例应用,我想做一个节点映射,这当然意味着每个节点都必须指向其他节点。但我还需要有一个节点列表,以便我可以轻松地搜索它们。 所以我想要一个列表,其中列表的每个对象都有指向同一列表的其他一些元素的指针(这在正常的 std::list 来回指针之外)。但是我担心 std::list 将如何处理其移动的元素之一,以及在这种情况下我如何处理自己的指针。

我已经放弃了 vector,因为文档已经指出,如果它被移动,所有指向其元素的指针和引用都将失效。如果我使用 std::list 的方法不起作用,我的第二个最好的办法是将节点列表保存在一个 vector 中,并使节点通过索引号相互引用(我可以这样做,因为一旦构建 vector 就不会改变它的大小)

最佳答案

but what happens to std::list if one of it's elements get's moved for reasons unrelated to the list itself?

在 C++ 中,运行时环境不允许以这种方式单方面移动对象,这正是您想象的原因——没有可靠或有效的方法来找到所有指向对象旧位置的指针并将它们修改为指向一个新的位置,因此任何偷偷移动对象的尝试都会冒着创建悬空指针的风险,这会导致未定义的行为。 (顺便说一句,这是垃圾收集器在 C++ 中不能很好工作的原因之一)

所以让你的列表节点对象在你背后移动不是你需要担心的事情。由于您的列表容器拥有节点的唯一所有权,因此发生这种情况的唯一方法是列表本身出于某种原因决定明确移动其节点之一(并且通常没有一般原因需要或想要这样做)。

关于c++ - 如果重新分配链表会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58829031/

相关文章:

c++ - 在 OMNET++ 中收到来自前一个模块的所有消息后,如何将一个消息发送到下一个模块

c++ - MFC 工作线程未在意外关闭时清理

c++ - UINT_MAX 是否所有位都设置为 1?

C++:对同一对象的两个单独的 `make_shared` 调用将创建两个单独且独立的 shared_ptr 及其控制 block ?

c++ - 程序输出仅在多线程程序中有时出现

c++链表 - 插入对象

c++ - mingw32-g++.exe : error: (invalid): No such file or directory

c++ - 低版本visual studio构建.dll

c++ - oop - C++ - 实现特定类型行为的正确方法?

c++ - 冒泡排序不工作