0

代码片段:

#include <new>
char buffer[512];

int main()
{
   double *pd;
   pd = new (buffer) double[5];
   delete [] pd;
   return 0;
}

这仅在使用 new 运算符的放置新形式时挂起。

我正在使用以下工具和选项:

> cl -EHsc foobar.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005
Microsoft (R) Incremental Linker Version 12.00.21005.1
4

3 回答 3

0
pd = new (buffer) double[5];

你在那里做的是重用buffer占用的内存来创建一个双精度数组。所以现在你正在删除一个你没有分配的内存new

于 2013-11-03T01:03:34.277 回答
0

不要那样做。程序没有用operator newor分配内存operator new[],所以不应该删除它。

于 2013-11-03T01:03:40.807 回答
0

您没有分配该内存,因此您不应尝试释放它(使用delete [])。

通常,您将运行析构函数:

for( i = 0; i < 5; i++ ) {
    T* p = pd + i;
    p->~T();
}

但为此double没有必要。

于 2013-11-03T01:03:41.623 回答