2009-12-18 35 views
4

下面是一些看起来很有趣的C++代码,但我知道它的工作原理。void指针缓冲区的结构实例化

有一个定义的结构,并且在程序中我们使用一个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

显示的代码泄漏内存 - 据推测,这在整个程序中不是问题。 –

回答

0

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

11

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

编辑:更有用链接

2

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

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

5

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

细节已经提供on this site.

1

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

0

如果你把一个文件读到malloc之后,但是在新的之前,你会做一些常见的(但很难看的)Load-In-Place破解,用于在序列化缓冲区中创建预初始化的C++对象。