如何释放CString的动态数组?

时间:2012-07-15 21:02:11

标签: visual-c++ memory-management mfc

我的类中有一个动态数组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动态数组那么我错过了什么?

3 个答案:

答案 0 :(得分:2)

您使用new[]分配CString数组。您必须使用delete[]来释放它 - 基本C ++内存规则。

在析构函数中使用:delete[] StringFormat;

答案 1 :(得分:1)

除了使用delete[] StringFormat删除字符串外,您还需要遵守三条规则

  • 提供复制构造函数
  • 提供分配过载功能

检查this

答案 2 :(得分:1)

您已使用new运算符分配内存,并尝试使用free释放内存。两者都有不同的堆,除了一些语义,它们不同。您使用new分配,使用delete释放内存。同样,您使用malloc进行分配,并使用free发布相同内容。你不能把它们混合在一起!

另外,正如其他人所提到的,如果您使用阵列模式new(而不是缩放器new),则必须使用阵列模式delete而不是标量{{}来删除它。 1}}(即delete,而非delete[])。

非常建议您使用deletevectorlistCArray或其他一些容器来拥有字符串数组,而不是管理它自己。