当我执行以下操作时:

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/

10-11 16:47