2009-11-13 103 views
3

我玩的动态内存分配“手动”,我想看看如何放置新的被人从MS实现,但是当我调试“步入”它让我感动代码:魔术放置新?

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

任何人都会向我解释,当我在这段代码中看到的所有内容都与return语句一致时,这个代码将我的对象放在指针指向的地方。我不认为在评论中说我希望这个fnc做的事实际上足以让它工作。 谢谢你的建设性答案。

回答

13

operator new的目的只是为对象分配内存,并返回指向该内存的指针。当你使用placement new时,你基本上告诉编译器“我知道这个内存很好,跳过分配,并且使用这个指针作为我的对象。”然后使用由operator new提供的指针调用对象的构造函数,而不管它是刚刚分配的内存还是使用放置新位置指定的内存。 operator new本身对你的对象的构造没有任何影响。

+0

这意味着你最好注意,有足够的地方来容纳'size_t'通过,否则你会遇到麻烦...... – 2009-11-14 19:54:27

5

请记住,new T(...)(称为“新表达式”)所做的是两件事:分配内存和初始化对象。你可以通过编写构造函数来调整初始化。对于你写的分配operator new。所以,尽管名称,operator new只做一个新表达式的一方。

放置新位置是为了将对象放入预先分配的内存中。您不能直接调用构造函数,将预分配的内存作为this指针传递。你可以做的唯一的事情就是使用新的布局:这将分配转换为空操作,只留下构造。这

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

只是没有操作的实施。

+0

@ sbi ::如何为阵列做一个新的位置?请参阅我的代码[链接](http://ideone.com/Yjc6y) – Atul 2012-03-26 10:28:29

+0

@Atul:我不确定我了解您的代码。无论如何,你要做的是在足够大的内存中创建数组的各个元素。然而,'std :: vector'就是这样做的,并且有很多花里胡哨的东西。另外,它比你自己的代码更不可能是bug。那么你为什么不简单地使用它? – sbi 2012-03-26 10:57:43