0

我的类中有一个动态数组,CString我在类new的构造函数中使用运算符来创建它,所以我在析构函数中写了一行来释放内存。它不会导致任何错误,但会导致运行时出现断点!错误是:Windows 在遗传算法.exe 中触发了一个断点。

这可能是由于堆损坏,这表明遗传算法.exe 或其已加载的任何 DLL 中存在错误。

这也可能是由于用户在遗传算法.exe 具有焦点时按 F12。

输出窗口可能有更多诊断信息。

代码是:

//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动态数组,所以我错过了什么?

4

3 回答 3

2

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

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

于 2012-07-15T23:54:59.810 回答
1

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

  • 提供复制构造函数
  • 提供赋值重载函数

检查这个

于 2012-07-16T06:14:12.747 回答
1

您已使用new运算符分配内存,并尝试使用free. 两者都有不同的堆,除了一些不同的语义。你分配使用new,释放内存使用delete。同样,您分配 usingmalloc和释放相同 using free。你不能混合它们!

此外,正如其他人所提到的,如果您使用数组模式new(而不是缩放器new),则必须使用数组模式delete而不是标量delete(即delete[],而不是delete)将其删除。

强烈建议您使用vectorlist、或其他容器来拥有字符串数组,而不是自己管理它CArrayCStringArray

于 2012-07-16T07:51:50.417 回答