MSVC 2012中数组的新位置错误?

时间:2014-10-17 23:14:23

标签: c++

当我做以下事情时:

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? 谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为C ++ placement new是严格要求将客户端代码可以看到的对象的开头放在您传递给new的缓冲区的开头。

只需要将它放在里面的某个地方。如果编译器没有在任何其他地方分配任何缓冲区,那么编译器就可以对空间做任何想做的事情是非常酷的。

所以你不应该依赖ptr1和ptr2具有相同的值,因为任何使用placement new,而不仅仅是这个。

但是,我并没有确定这一点。我错了。