【问题标题】:Visual C++ heap corruption error using delete [] and new (placement) operators使用 delete [] 和 new(放置)运算符的 Visual C++ 堆损坏错误
【发布时间】:2013-11-13 22:48:36
【问题描述】:

代码sn-p:

#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

【问题讨论】:

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


【解决方案1】:

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

一般来说,你会运行析构函数:

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

但对于double,这不是必需的。

【讨论】:

    【解决方案2】:
    pd = new (buffer) double[5];
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-06-20
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        相关资源
        最近更新 更多