在特定内存地址创建新的 C++ 对象?

Posted

技术标签:

【中文标题】在特定内存地址创建新的 C++ 对象?【英文标题】:Create new C++ object at specific memory address? 【发布时间】:2010-12-06 00:02:35 【问题描述】:

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

【问题讨论】:

【参考方案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();

【讨论】:

【参考方案2】:

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

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

【讨论】:

感谢您对一个好问题的好回答。我今天学了些新东西。我最终会把 C 构造扇入 cpp 世界来实现这一点。 +1 用于指定必须显式调用析构函数,通常你不在乎,但是当它除了释放内存之外还有副作用时...... 我强烈建议您多次阅读 Marshall Cline 的 C++ FAQ Lite 的全部。这是一种宝贵的资源。 不幸的是,您指出的文章是有缺陷和错误的。使用这样的 char 数组不是一个好主意。问题是这样声明的数组没有保证对齐。您需要做的是使用 vector 因为内存是动态分配的,所以内存将被正确别名(如果分配的空间等于或大于对象的大小(请查看 alighment 属性中的 new标准)) 链接坏了:(【参考方案3】:

在 Windows 上,MapViewOfFileEx 和 VirtualAllocEx 允许指定首选虚拟地址。但不能保证。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

有什么方法可以在编译时执行placement new 之类的操作吗?

以上是关于在特定内存地址创建新的 C++ 对象?的主要内容,如果未能解决你的问题,请参考以下文章

在特定内存位置构造c ++对象[重复]

在python中写入内存中的特定地址

C++中内存分配问题

如何在特定地址创建 SQLite 内存数据库

显式地向内存中的特定地址/位置分配或访问值?

小白学习C++ 教程十C++中指针和内存分配