3

我正在“手动”玩动态内存分配,我想看看 MS 的人如何实现新的放置,但是在调试时我“步入”它让我开始编写代码:

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

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

4

2 回答 2

14

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

于 2009-11-13T20:56:48.737 回答
5

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

Placement new 用于将对象放入预分配的内存中。您不能直接调用构造函数,将预分配的内存作为this指针传递。你唯一能做的就是使用placement new:这会将分配变成无操作,只剩下构造需要完成。这个

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

只是那个无操作的实现。

于 2009-11-13T23:13:59.170 回答