【问题标题】:Struct instantiation from void pointer buffer从 void 指针缓冲区进行结构实例化
【发布时间】:2010-12-28 03:49:12
【问题描述】:

这里有一些 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;
}

代码有更多内容,但这就是它的要点。

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

谢谢。

编辑:修复了内存泄漏。

【问题讨论】:

  • 显示的代码泄漏内存 - 大概在完整程序中这不是问题。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    编辑:更有用的链接

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        详情已经提供on this site.

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-03-13
                • 2018-04-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-02-08
                • 1970-01-01
                • 2016-03-21
                相关资源
                最近更新 更多