当我做以下事情时:
T* ptr2 = new (ptr1) T();
我获得了ptr1 == ptr2
当我在做的时候:
T* ptr2 = new (ptr1) T[6];
我在MSVC 2012的调试中获得了ptr2> ptr1(关闭3个字节)
但是“新”文件中的代码是:
inline void *__CRTDECL operator new[](size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
我假设添加了一些调试信息,但我无法理解这个
最初的ptr1是通过malloc获得的,所以我认为它应该与任何可能的类型对齐,所以我不认为对齐是一个问题。
我做的事情不应该在这里工作吗?为什么ptr2!= ptr1? 谢谢!
答案 0 :(得分:0)
我不认为C ++ placement new是严格要求将客户端代码可以看到的对象的开头放在您传递给new的缓冲区的开头。
只需要将它放在里面的某个地方。如果编译器没有在任何其他地方分配任何缓冲区,那么编译器就可以对空间做任何想做的事情是非常酷的。
所以你不应该依赖ptr1和ptr2具有相同的值,因为任何使用placement new,而不仅仅是这个。
但是,我并没有确定这一点。我错了。