【发布时间】:2010-12-06 00:02:35
【问题描述】:
在 C++ 中是否可以在特定内存位置创建新对象?我有一块共享内存,我想在其中创建一个对象。这可能吗?
【问题讨论】:
标签: c++ memory object pointers location
在 C++ 中是否可以在特定内存位置创建新对象?我有一块共享内存,我想在其中创建一个对象。这可能吗?
【问题讨论】:
标签: c++ memory object pointers location
假设您有一个指向要放置对象的内存位置的指针,我相信可以将指针转换为新类型,然后将对象放置在该指针的位置。这是一个不需要 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();
【讨论】:
你想要placement new()。它基本上使用一块现有内存而不是从堆中分配新内存来调用构造函数。
编辑:在使用之前,请确保您了解有关负责为使用放置new() 创建的对象显式调用析构函数的注意事项!
【讨论】:
在 Windows 上,MapViewOfFileEx 和 VirtualAllocEx 允许指定首选虚拟地址。但不能保证。
【讨论】:
如果你想分配很多细粒度的对象,最好的方法是结合使用placement new 和某种环形缓冲区。否则,除了对象指针本身之外,您还必须跟踪指针。
【讨论】:
是的。您需要使用运算符 new() 的放置变体。例如:
void *pData = ....; // memory segment having enough space to store A object
A *pA = new (pData) A;
请注意,placement new 不会引发异常。
【讨论】:
placement new 之类的操作吗?