使用delete []和new(placement)运算符的Visual C ++堆损坏错误

时间:2013-11-03 00:58:40

标签: c++ visual-c++ windows-7

代码段:

#include <new>
char buffer[512];

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

仅在使用新运算符的展示位置新形式时才会挂起。

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

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

3 个答案:

答案 0 :(得分:0)

pd = new (buffer) double[5];

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

答案 1 :(得分:0)

不要那样做。该程序没有使用operator newoperator new[]分配内存,因此不应删除它。

答案 2 :(得分:0)

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

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

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

double不是必需的。