从void指针缓冲区实例化结构体

4

这里有一段C++代码,看起来有些奇怪,但我知道它是有效的。

定义了一个结构体,在程序中使用void指针分配内存。然后使用分配的缓冲区创建结构体。

以下是代码:

typedef struct{
 char buffer[1024];
} MyStruct

int main()
{
   MyStruct* mystruct_ptr = 0;

   void* ptr = malloc(sizeof(MyStruct));

   // This is the line that I don't understand
   mystruct_ptr = new (ptr) MyStruct();

   free(ptr);

   return 0;
}

代码还有更多内容,但这就是要点。
我没有测试过这段代码,但我看到的代码经过了很好的测试并且可以正常工作。但是为什么呢?
谢谢。
编辑:修复了内存泄漏问题。

1
展示的代码存在内存泄漏 - 大概在完整程序中不是问题。 - Jonathan Leffler
7个回答

11

这被称为定位 new,它可以在预先分配的缓冲区上构造一个对象(您指定地址)。

编辑:更有用的链接


5
那就是放置新的。它将运行任何必要的构造函数和初始化,但您提供内存而不是让new为您分配它。
详情已在本网站上提供。

2
这是placement-new。它告诉new返回一个特定的地址而不是实际分配内存。但重要的是,它仍然调用构造函数。
当您需要在特定内存地址创建对象时,就需要使用这种技术。

2
Scott Meyers在《Effective C++》中非常好地描述了这种技术。

1

这个结构是放置新的。编译器不是分配内存并调用类构造函数,而是在指定的内存位置构造实例。这种对内存分配和释放的控制在优化长时间运行的程序方面非常有用。


0

在 Google 上搜索 “placement new”。


0
如果你在 malloc 之后但 new 之前放置了一个文件读取,那么你就会使用常见(但丑陋)的 Load-In-Place hack来创建序列化缓冲区中预初始化的 C++ 对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接