魔术在新的位置?

时间:2009-11-13 20:50:50

标签: c++ memory-management placement-new

我正在“手动”使用动态内存分配,我想看看来自MS的人是如何实现贴片新的,但是在调试时我“步入”它让我感动代码:

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{   // construct array with placement at _Where
return (_Where);
}

有人可以向我解释一下,当我在这段代码中看到的所有内容都是使用我提供的参数作为return语句的行时,这个代码如何将我的对象放置到我的指针所指向的位置。我不认为在评论中说我希望这个fnc做什么实际上足以让它起作用。 感谢您提出任何建设性的答案。

2 个答案:

答案 0 :(得分:14)

operator new的目的只是为对象分配内存,并将指针返回到该内存。当你使用placement new时,你实际上告诉编译器“我知道这个内存是好的,跳过分配,并使用这个指针作为我的对象。”然后使用operator new提供的指针调用对象的构造函数,无论它是刚刚分配的内存,还是使用placement new指定的内存。 operator new本身与你的对象的构造方式无关。

答案 1 :(得分:5)

请记住,new T(...)(称为“new-expression”)的作用是两件事:分配内存和初始化对象。您可以通过编写构造函数来调整初始化。对于分配,您编写operator new。因此,尽管名称如此,operator new只表达了新表达式的一面。

Placement new用于将对象放入预先分配的内存中。您不能调用构造函数直接将预分配的内存作为this指针传递。你唯一能做的就是使用placement new:这会将分配转换为no-op,只剩下构造了。此

inline void* operator new(size_t, void *p) throw()
{
  return p;
}

只是该无操作的实现。