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)