44

在 C++ 中是否可以在特定的内存位置创建一个新对象?我有一块共享内存,我想在其中创建一个对象。这可能吗?

4

6 回答 6

71

你想要放置new()。它基本上使用一块现有内存而不是从堆中分配新内存来调用构造函数。

编辑:确保您了解有关负责在使用放置new()之前为使用放置创建的对象显式调用析构函数的说明!

于 2009-10-12T14:08:13.307 回答
16

是的。您需要使用运算符 new() 的放置变体。例如:

void *pData = ....; // memory segment having enough space to store A object
A *pA = new (pData) A;

请注意,placement new 不会引发异常。

于 2009-10-12T14:10:11.963 回答
1

如果你想分配很多细粒度的对象,最好的方法是结合使用placement new和某种环形缓冲区。否则,除了对象指针本身之外,您还必须跟踪指针。

于 2009-10-13T07:24:00.763 回答
1

假设您有一个指向要放置对象的内存位置的指针,我相信可以将指针转换为新类型,然后将对象放置在该指针的位置。这是一个不需要 new() 的解决方案。

鉴于你的记忆:

// you would use the pointer you have to your allocation of memory char* mem_start = new char[1024]; // Now we have 1024 bytes to play with

可以将其转换为给定类型:

CustomType* object_ptr = (CustomType*) mem_start;

最后,您可以在那里构造一个对象:

*(object_ptr) = CustomType();

于 2018-09-14T19:29:41.530 回答
0

在 Windows 上,MapViewOfFileExVirtualAllocEx允许指定首选虚拟地址。虽然没有保证。

于 2017-02-27T10:44:51.077 回答
0
int *ptr=(int *)0x1234;
classname *objname = new (ptr) classname;

你可以通过简单地做到这一点。

于 2022-01-19T15:58:15.433 回答