来自void指针缓冲区的struct实例化

时间:2009-12-18 19:13:15

标签: c++ struct allocation void-pointers placement-new

这里有一些看起来很有趣的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;
}

代码有更多的东西,但这是它的要点。

我还没有测试过这段代码,但我正在查看的代码经过了很好的测试,并且可以运行。但是如何?

感谢。

编辑:修正了内存泄漏问题。

7 个答案:

答案 0 :(得分:11)

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

编辑:更有用的链接

答案 1 :(得分:5)

这是新的展示位置。它将运行所需的任何构造函数和初始化,但是您提供内存而不是让new为您分配。

已提供详细信息on this site.

答案 2 :(得分:2)

这是贴牌新品。这告诉new返回一个特定的地址而不是实际分配内存。但重要的是,它仍在调用构造函数。

当您需要在特定内存地址创建对象时,需要使用此技术。

答案 3 :(得分:2)

Scott Meyers在Effective C++中很好地描述了这种技术。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

在Google上搜索“placement new”。

答案 6 :(得分:0)

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