魔术放置新?
问题描述:
我玩的动态内存分配“手动”,我想看看如何放置新的被人从MS实现,但是当我调试“步入”它让我感动代码:魔术放置新?
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
莫非
任何人都会向我解释,当我在这段代码中看到的所有内容都与return语句一致时,这个代码将我的对象放在指针指向的地方。我不认为在评论中说我希望这个fnc做的事实际上足以让它工作。 谢谢你的建设性答案。
答
operator new
的目的只是为对象分配内存,并返回指向该内存的指针。当你使用placement new时,你基本上告诉编译器“我知道这个内存很好,跳过分配,并且使用这个指针作为我的对象。”然后使用由operator new
提供的指针调用对象的构造函数,而不管它是刚刚分配的内存还是使用放置新位置指定的内存。 operator new
本身对你的对象的构造没有任何影响。
答
请记住,new T(...)
(称为“新表达式”)所做的是两件事:分配内存和初始化对象。你可以通过编写构造函数来调整初始化。对于你写的分配operator new
。所以,尽管名称,operator new
只做一个新表达式的一方。
放置新位置是为了将对象放入预先分配的内存中。您不能直接调用构造函数,将预分配的内存作为this
指针传递。你可以做的唯一的事情就是使用新的布局:这将分配转换为空操作,只留下构造。这
inline void* operator new(size_t, void *p) throw()
{
return p;
}
只是没有操作的实施。
这意味着你最好注意,有足够的地方来容纳'size_t'通过,否则你会遇到麻烦...... – 2009-11-14 19:54:27