C++ 魔术在新的位置?

C++ 魔术在新的位置?,c++,memory-management,placement-new,C++,Memory Management,Placement New,我正在“手动”进行动态内存分配,我想看看微软的伙计们是如何实现placement new的,但在调试时,我“介入”了,这让我想到了代码: inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0() { // construct array with placement at _Where return (_Where); } 有人能给我解释一下,当我在代码中看到的都是带有我作为参数提供的返回语句的行时,这段代码到底

我正在“手动”进行动态内存分配,我想看看微软的伙计们是如何实现placement new的,但在调试时,我“介入”了,这让我想到了代码:

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{   // construct array with placement at _Where
return (_Where);
}
有人能给我解释一下,当我在代码中看到的都是带有我作为参数提供的返回语句的行时,这段代码到底是如何将我的对象放置在指针指向的位置的吗。我不认为在评论中说我希望fnc做什么就足以让它发挥作用。
谢谢您的建设性回答。

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

请记住,
new T(…)
(称为“新表达式”)所做的是两件事:分配内存和初始化对象。您可以通过编写构造函数来调整初始化。对于您编写的分配
运算符new
。因此,不管名称如何,
操作符new
只执行新表达式的一个方面

新的放置方式是将对象放入预先分配的内存中。不能直接调用构造函数,将预先分配的内存作为
指针传递。你唯一能做的就是使用placement new:这会将分配变成一个无操作,只剩下构建工作要做。这个

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

只是实现了no-op.

,这意味着您最好注意有足够的有效位置来容纳传递的
大小,否则您会遇到麻烦…@sbi::如何为新阵列进行放置?请参考我的代码@Atul:我不确定我是否理解你的代码。无论如何,您要做的是在一个足够大的内存块中创建数组的各个元素。然而,
std::vector
正是这样做的,它也有很多的功能。此外,与您自己的代码相比,它不太可能出现错误。那你为什么不干脆用它呢?