在没有放置新方法的情况下,将对象分配给c ++中的预定义地址

时间:2014-02-03 12:42:29

标签: c++ pointers destructor placement-new

在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,因为我在内核级别开发。

4 个答案:

答案 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();

来源:What is an in-place constructor in C++?