我的类中有一个动态数组CString
,我在我的类的构造函数中使用new
运算符来创建它,所以我在析构函数中写了一行来释放内存。它不会导致任何错误,但会在运行时导致断点!
错误是:
Windows已在Genetic Algorithm.exe中触发了断点。
这可能是由于堆的损坏,这表明Genetic Algorithm.exe或它已加载的任何DLL中存在错误。
这也可能是由于用户按下F12而Genetic Algorithm.exe具有焦点。
输出窗口可能包含更多诊断信息。
,代码是:
//in constructor
StringFormat = new CString[Info.VariablesCount + 1];
for (int i=0;i<=Info.VariablesCount;i++)
StringFormat[i] = "%2.3f";`
// in destructor
free(StringFormat);
请注意StringFormat*
是类的私有成员,我在这个类中也有一些其他动态数组,但我可以使用free方法轻松释放它们,这个问题只适用于CString
动态数组那么我错过了什么?
答案 0 :(得分:2)
您使用new[]
分配CString
数组。您必须使用delete[]
来释放它 - 基本C ++内存规则。
在析构函数中使用:delete[] StringFormat;
答案 1 :(得分:1)
答案 2 :(得分:1)
您已使用new
运算符分配内存,并尝试使用free
释放内存。两者都有不同的堆,除了一些语义,它们不同。您使用new
分配,使用delete
释放内存。同样,您使用malloc
进行分配,并使用free
发布相同内容。你不能把它们混合在一起!
另外,正如其他人所提到的,如果您使用阵列模式new
(而不是缩放器new
),则必须使用阵列模式delete
而不是标量{{}来删除它。 1}}(即delete
,而非delete[]
)。
非常建议您使用delete
,vector
,list
,CArray
或其他一些容器来拥有字符串数组,而不是管理它自己。