在c ++中是否可以在内存中的特定位置分配对象?我正在实现我的业余爱好os内核内存管理器,它提供void*
个地址来存储我的东西,我想知道如何使用该指针在那里分配我的对象。我试过这个:
string* s = (string*)235987532//Whatever address is given.
*s = string("Hello from string\n\0");//My own string class
//This seems to call the strings destructor here even thought I am using methods from s after this in my code...
唯一的问题是它调用字符串对象析构函数,它不应该这样做。任何帮助表示赞赏。
编辑:我不能使用placement new,因为我在内核级别开发。
答案 0 :(得分:5)
分配仅在已存在有效对象时才有效。要在任意内存位置创建对象,请使用placement new:
new (s) string("Hello");
完成它后,你应该使用显式的析构函数调用来销毁它
s->~string();
更新:我刚刚注意到您的问题规定“没有新位置”。在这种情况下,答案是“你不能”。
答案 1 :(得分:4)
您需要使用新的展示位置。没有替代方案,因为这正是新的布局。
答案 2 :(得分:2)
我认为您应该能够首先实现展示位置新用作的operator new
:
void* operator new (std::size_t size, void* ptr) noexcept
{
return ptr;
}
(参见C ++ 11中的[new.delete.placement]
)
然后,您可以按照预期的方式使用新的展示位置。
答案 3 :(得分:0)
您可以使用展示位置新分配
void* memory = malloc(sizeof(string));
string* myString = new (memory) string();