当我执行以下操作时:
T* ptr2 = new (ptr1) T();
我得到ptr1 == ptr2
当我在做:
T* ptr2 = new (ptr1) T[6];
我在调试中的MSVC 2012下获得ptr2> ptr1(关闭了3个字节)
但是,"new"文件中的代码是:
inline void *__CRTDECL operator new[](size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
我假设添加了一些调试信息,但我无法理解这一点
初始ptr1是通过malloc获得的,因此我认为它应该与任何可能的类型对齐,因此我认为对齐不是问题。
我正在做一些不应该在这里工作的事情吗?为什么会ptr2!= ptr1?
谢谢!
最佳答案
我认为在将客户端代码可以看到的对象的开头放置在传递给new的缓冲区的开头时,并不需要严格地将C++放置为new。
只需要将其放置在其内部的某个位置即可。如果编译器没有在其他任何地方分配任何缓冲区,则使用该空间进行任何操作都是很酷的。
因此,对于任何新的放置位置(而不仅仅是此位置),都不应依赖于具有相同值的ptr1和ptr2。
不过我并不确定。我可能是错的。
关于c++ - MSVC 2012中数组的新放置错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26434658/