The*_* do 3 c++ memory-management placement-new
我正在"手动"使用动态内存分配,我想看看来自MS的人是如何实现placement new的,但是在调试时我"步入"它让我转到代码:
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释这个代码究竟是如何将我的对象放在我的指针所指向的位置,当我在这段代码中看到的所有东西都与带有我作为参数提供的内容的return语句对齐时.我不认为在评论中说我希望这个fnc做什么实际上足以让它起作用.谢谢你的建设性答案.
Ada*_*ras 14
目的operator new只是为对象分配内存,并将指针返回到该内存.当你使用placement new时,你实际上告诉编译器"我知道这个内存是好的,跳过分配,并使用这个指针作为我的对象." 然后使用指针调用您的对象的构造函数,该指针是由operator new刚刚分配的内存还是使用placement new指定的内存.operator new本身与你的物体的构造方式无关.
请记住,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;
}
Run Code Online (Sandbox Code Playgroud)
只是那个无操作的实现.