从 void 指针缓冲区实例化结构体
这里有一些 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;
}
该代码还有更多内容,但这就是要点。
我还没有测试过这段代码,但是我正在查看的代码经过了很好的测试,并且可以工作。但如何呢?
谢谢。
编辑:修复了内存泄漏。
Here's some C++ code that just looks funny to me, but I know it works.
There is a struct defined, and in the program we allocate memory using a void pointer. Then the struct is created using the allocated buffer.
Here's some code
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;
}
The code has more stuff, but that's the gist of it.
I haven't tested this code, but the code I'm looking at is very well tested, and works. But how?
Thanks.
EDIT: Fixed that memory leak.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
这称为 placement new,它构造一个对象在预先分配的缓冲区上(您指定地址)。
编辑:更有用的链接
This is called placement new, which constructs an object on a pre-allocated buffer (you specify the address).
Edit: more useful link
这就是新的安置。它将运行所需的任何构造函数和初始化,但您要提供内存,而不是让
new
为您分配内存。本网站已提供详细信息。
That is the placement new. It will run any constructors and initialization needed, but you are supplying the memory instead of having
new
allocate it for you.Details have already been provided on this site.
这是新的安置。这告诉 new 返回一个特定的地址而不是实际分配内存。但重要的是,它仍在调用构造函数。
当您需要在特定内存地址创建对象时,需要使用此技术。
This is placement-new. This tell new to return a specific address instead of actually allocating memory. But importantly, it is still invoking the constructor.
This technique is needed when you need to create an object at a specific memory address.
Scott Meyers 在 高效的 C++。
Scott Meyers describes this technique very well in Effective C++.
该构造是新放置的。编译器不是分配内存并调用类构造函数,而是在指定的内存位置构造实例。这种对内存分配和释放的控制对于优化长时间运行的程序非常有用。
That construct is placement new. Rather than allocating memory and invoking the class constructor the compiler constructs the instance in the memory location specified. This sort of control over memory allocation and deallocation is tremendously useful in optimizing long running programs.
在 Google 上搜索“新展示位置”。
Search Google for "placement new".
如果您将一个文件读取放在 malloc 之后但 new 之前,那么您将执行常见的(但丑陋的) Load-In-Place hack,用于在序列化缓冲区中创建预初始化的 C++ 对象。
If you put a file read after the malloc but before the new, you'd be doing the common (but ugly) Load-In-Place hack for creating pre-initialized C++ objects in a serialized buffer.