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;
}

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

我没有测试过这段代码,但我正在查看的代码已经过很好的测试,并且可以正常工作。但是怎么做?

谢谢。

编辑:修复了内存泄漏。

4

7 回答 7

11

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

编辑:更有用的链接

于 2009-12-18T19:15:07.323 回答
5

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

本网站已提供详细信息。

于 2009-12-18T19:15:35.967 回答
2

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

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

于 2009-12-18T19:15:21.473 回答
2

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

于 2009-12-18T19:21:03.037 回答
1

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

于 2009-12-18T19:16:33.017 回答
0

在 Google 上搜索“新展示位置”。

于 2009-12-18T19:15:03.190 回答
0

如果您在 malloc 之后但在 new 之前放置一个文件读取,您将执行常见的(但丑陋的)Load-In-Place hack,用于在序列化缓冲区中创建预初始化的 C++ 对象。

于 2009-12-18T23:37:54.287 回答