c++ - 销毁调用安置新

标签 c++ new-operator placement-new

我有一个基本问题。

一般来说,使用placement new,我们可以在预分配的内存上构造对象。

举个例子:My_CLass 大小是 20 字节,想为 5 个对象创建一个池。所以5*20 => 已经分配了100个字节,池的起始地址是0x1234

现在,使用 placement new,我在内存池中放置了 3 个对象。

我的问题是,

  1. 起始地址为 0x1234,是否可以找到 池中有效对象的数量?

  2. 如果我摧毁第二个 对象,系统如何知道第二个要创建的下一个对象 位置等等?

最佳答案

在本次讨论中,“池”一词用于表示某种预分配的内存,用于保存一组特定类型的对象(可以是所有一个类,也可以是不同的类,相关或不相关)

  1. 也许吧。这完全取决于池本身的设计和实现方式。

  2. 池假设支持此类操作的正确且有效的实现,将跟踪可用空间的位置、大小等。

    这通常的工作方式是在池的元数据中存储一个指针(换句话说,关于池本身的数据,知道池的大小,分配了多少元素等),这是池中自由元素链表的头部。这只是一种解决方案,但它是一种相当常见的解决方案。

请注意,这种情况与从堆中分配的常规 new 绝对没有区别,除非您有一个能够跟踪池中元素数量的特定池,普通堆不允许您直接这样做(您最有可能找出总共有多少分配,但这可以是从文件缓冲区分配和动态字符串到类型 X、类型 Y 的对象的任何东西 -堆本身不跟踪特定分配的目的是什么,那是“别人的问题”)。

关于c++ - 销毁调用安置新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49271667/

相关文章:

c++ - 一个 lambda 的返回类型可以通过返回值来推断,那么为什么不能是一个函数呢?

c++ - 如何将 Linux C++ 源代码转换为 Windows C++ 源代码?

c++ - gdb 中的打印值什么时候会不正确?

c++ - 防止或阻止 cpu 数据缓存加载

c++ - 在具有引用成员的对象上使用放置 `new` 的结果

c++ - 唯一指针内存泄漏

c++ - 为类重载运算符 new

c++ - 具有动态分配内存的 vector 无法删除最后一个

c++ - 我可以在 operator= 中使用 placement new(this) 吗?

C++删除,但不只是类型