c++ - 堆上的内存地址是否被重用?

标签 c++ memory

标题问题的进一步解释是有序的,让我解释一下我的场景。

我有一个指向堆上几个对象的指针的列表容器。每当创建一个新对象时,指向它的指针就会被添加到列表中,而每当删除一个对象时,它的指针就会被删除。可以肯定地说,此列表中的所有指针始终有效。

列表中的许多对象都包含指向同一列表中其他对象的指针。

在取消引用任何这些指针之前,我想使用 CheckAgainstList(ptr*) 函数来确保一个对象指向同一列表中的另一个对象,因此不指向到已被删除的对象。

现在戴上你的锡纸帽子,这可能吗?

  1. 对象 A 有一个指向对象 B 的指针,其内存地址为 0x00988e50
  2. 对象 B 被删除。
  3. 创建对象 C 并将其放入新释放的内存空间 0x00988e50
  4. CheckAgainstList(ptr*) 当我们检查指针时返回 true,因为对象 C 在列表中并且与 B 曾经占用的内存地址相同。

现在我们有一个错误,因为 A 认为它有一个指向 B 的指针,但是 B 已经不存在了,可以说 C 已经取代了它的位置。

这个潜在的错误甚至可能吗?

最佳答案

不仅可能,而且很有可能。一个好的内存分配器会尝试尽可能多地重用内存,以减少碎片和膨胀。

您尝试解决的问题可能适合 weak_ptr ,可以在使用前检查其有效性。

关于c++ - 堆上的内存地址是否被重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11161682/

相关文章:

linux - CentOS内存使用异常

c++ - 我对 GLM lookAt 函数的理解不一致

c++ - 全屏运行 allegro 程序后出现屏幕分辨率问题

C++: "trait"和 "meta-function"是同义词吗?

c++ - 在 Lemon 图形库中使用 Dijkstra 算法

c - 如何将4个字节的char缓冲区复制到long中

c++ - 为什么 SDL_BlitSurface 的 SDL_Rect* 参数不是常量?

c++ - 分配类型为自己类 C++ 的 vector 的内存

c - printf 是如何工作的?

c - 如何有条不紊地追踪源代码的位置