【问题标题】:Array of CString -> Memory Leak?CString 数组 -> 内存泄漏?
【发布时间】:2012-05-04 07:38:35
【问题描述】:

我有一个 CString 数组作为我班级的成员:

...
private:
 CString mStrings[7];
...

尽管类的析构函数被正确调用,但我的分析工具告诉我,七个 mString 中的每一个都存在内存泄漏(每次我分配和释放我的类时)。

我认为 CStrings 自己管理它们的内存。我将它们放在一个数组中这一事实是否会改变这里的任何东西?

【问题讨论】:

  • 显示代码。你的分析工具是什么,它什么时候运行,你的类是如何创建的等等等等。
  • 您将需要向我们展示一些代码,拥有一个字符串数组并不会改变字符串管理自己的内存这一事实。如果您只是像显示的那样创建一个数组(在自动存储上) ,您无需显式地解除分配的内存。
  • 您能否提供更多代码来显示您的实际操作以及错误是什么(最好是sscce)?另外,这是微软的 CString 还是另一个?它绝对不是标准的 C++,所以你应该提一下。
  • 这方面的代码不多。对象通过 new 分配,然后通过 delete 释放。类本身不包含太多内容,主要是上面显示的 CString 数组。我用于泄漏检测的工具是“Memory Validator”。

标签: c++ arrays memory-leaks cstring


【解决方案1】:

不,那不应该泄漏。除非您使用newnew[](或malloc)分配内存并且不释放(使用deletedelete[]free)内存,否则不会出现任何泄漏。

在您的情况下,阵列处于自动存储中,因此它会自动被清理。此外,CStrings 会自动管理他们的内存。要么是误报,要么是其他代码导致了问题。

编辑 - 尽管CString 不会泄漏,但可能不会出现误报。你有没有机会初始化为:

unsigned char* x = new unsigned char[10];
CString str(x);

忘记delete[] x,或类似的东西?

编辑 2 - 错误可能出现在您的类的未删除实例上:

struct X
{
private:
   CString mStrings[7];
};

//...
X* x = new X;

【讨论】:

  • 好吧,我猜 Memory Validator 只是在这里报告了误报。我对这个工具很陌生,所以我不知道我可以信任它的程度;-)
  • @Boris:老实说,如果它对这样一个简单的用例给出了误报,我会进一步调查。要么你在使用它时做错了什么,要么这个工具对于任何实际用途都完全没用。
  • @Boris 我也认为误报是牵强的,你是如何构造对象的?
  • 如果一个工具给出了误报 - 该工具应该被扔进垃圾箱。
  • 我正在像这样初始化每个 CString mStrings[i] = "SomeBlaBla"。所以没有未删除的字符数组。不过谢谢你的提示!
【解决方案2】:

我要在这里实现一个信念的飞跃,CString 实际上是 char *

如果这是强制转换并且类已经分配了它们,那么析构函数需要释放它们。

对该对象的删除将是浅的。有问题。

但最后一点 - CString 的类型是什么?

【讨论】:

猜你喜欢
  • 2017-10-29
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多