INVALID HEAP ARGUMENT:用 operator new[] 分配,用 operator delete 释放

Posted

技术标签:

【中文标题】INVALID HEAP ARGUMENT:用 operator new[] 分配,用 operator delete 释放【英文标题】:INVALID HEAP ARGUMENT: allocated with operator new[], freed with operator delete 【发布时间】:2015-10-02 02:09:35 【问题描述】:

我正在使用 Dr. Memory 来调试我的代码。它给了我以下信息:

INVALID HEAP ARGUMENT: allocated with operator new[], freed with operator delete

但是,每当我使用 delete[] 而不是 delete 时,都会出现同样的错误。错误发生在以下几行:

for (int x = 0; x < width; ++x)

    delete data[x];

delete [] data;

变量data分配如下:

data = new char*[width];
for (int i = 0; i < width; ++i)

    data[i] = new char[1];

有人可以帮帮我吗?

【问题讨论】:

那是因为你还在用delete来删除用new[]分配的东西。 将单个字符分配为数组?那是划桨。事实上,原始内存滥用通常是一种划桨,你为什么不使用std::vector 【参考方案1】:

您当前分配的元素与

data[i] = new char[1];

并删除它们

delete data[x];

当您使用 new[] 分配它们时,您需要使用 delete [] 删除它们。

delete [] data[x];

【讨论】:

我正在这样做。但是一旦我这样做,它就会告诉我我应该使用 delete 而不是 delete[] 您确定您没有其他对new 的呼叫,而只是对data[i] = new char 或类似的呼叫?【参考方案2】:

你也需要匹配第二个new[] (data[i] = new char[1]):

for (int x=0; x<width; ++x)
    delete [] data[x];

delete [] data;

【讨论】:

【参考方案3】:

由于您使用的是 c++,而不是 C...

重构代码以使用 STL 和 std::string 在程序中创建 std::strings 向量。

使用 std::string 可能会消除内存泄漏。

【讨论】:

以上是关于INVALID HEAP ARGUMENT:用 operator new[] 分配,用 operator delete 释放的主要内容,如果未能解决你的问题,请参考以下文章

错误:(gcloud.app.deploy)INVALID_ARGUMENT:无法解析源

INVALID_CAST_ARGUMENT:值不能转换为日期

“在抛出 std::invalid_argument' what(): stoi 的实例后调用终止?”

错误:无效地址(argument="address",value=undefined,code=INVALID_ARGUMENT,version=address/5.1.0)

tensoboard Invalid argument 以及 Invalid format string问题解决

我不断收到 'std::invalid_argument' what(): stoi 异常抛出似乎没有理由?