【问题标题】:OS dependent C++ memory leaks?依赖于操作系统的 C++ 内存泄漏?
【发布时间】:2013-09-01 15:33:08
【问题描述】:

上下文

我在 Linux 下的代码库上为我的跨平台库运行 Valgrind。我想看看这是否足够,或者我是否应该对WindowsMac 也进行动态代码分析

问题

如果我的平台无关 C++ 代码没有在Linux 上泄漏(根据Valgrind),我可以假设它也没有在WindowsMac 上泄漏吗?如果不是,请提供一个独立于平台的 C++ 示例,它不会在Linux 上泄漏(根据Valgrind)但在Windows 和/或Mac 上泄漏(选择“通用”编译器,如 VC++、GCC 等中的编译器) .

精度(感谢 cmets 和答案)

  1. 我对独立于平台的 C++ 代码感兴趣(所以没有 #ifdef 等);
  2. 我考虑的是我拥有的 C++ 代码,而不是第三方代码;
  3. 我认为 Valgrind 是基本事实,但我可以考虑任何其他工具。我知道没有任何工具可以检测到所有内存泄漏。

【问题讨论】:

  • 如果你有平台相关的代码或使用平台相关的第三方库,你绝对应该在WindowsMac 上运行valgrind 分析。因为即使编译器也是平台相关的,并且可能包含平台相关的错误 -> 运行 valgrind。
  • 确实!我编辑了我的问题,只关注与平台无关的 C++ 代码。
  • 我只考虑我的 C++ 代码。不是第三方库之一。
  • 哦,不要忘记可能会导致 C++ 代码泄漏的实现错误,尽管那只是运气不好。
  • @rubenvb:我不“拥有”这段代码;)

标签: c++ linux windows macos memory-leaks


【解决方案1】:

您可以确定通用代码没有泄漏,但当然,如果您的应用程序规模不错,您的代码很可能有一些特定于 Linux,其他部分特定于 Windows 和某些部分特定于 OS X。

那些不特定于 Linux 的部分当然不会被 Valgrind 测试。

所以如果你有一些代码可以做到:

#if LINUX
 char buffer[512]; 
#else
  char buffer = new buffer[2048]; 
#endif
  ... use buffer ... 

那么您在 Windows 中存在内存泄漏,但在 Linux 中没有。

显然,这是一个微不足道的例子,但类似的事情有时会潜入代码中。

当然,在一个操作系统中使用某种系统调用可能是“安全的”,不会关闭或“告诉操作系统你已经完成”,然后在另一个操作系统中出现问题。

另外,正如我之前指出的,Valgrind 不保证您没有遇到内存使用问题 - 它只检测以下内容:

 void func()
 {
     char *p = new [1700];
     ... 
     // no free of p;
 }

 void func()
 {
     char *p = new [1700];
     ... 
     // No free. 
     p = some_other_pointer; 
     ... 
 }

但不是:

 void func()
 {
    vector<int> v;
    for(;;)
       v.push_back(1); 
 }

因为内存仍然由某物“拥有”。当然,这个特殊的例子是非常极端的,但是你可以有类似的东西,代码存储一些东西,只是向存储中添加越来越多的项目,而不是删除它们。

【讨论】:

  • 我要求提供独立于平台的代码^^。请参阅我的编辑。另外,我精确地说“根据 Valgrind”。
【解决方案2】:

valgrind有助于发现缺陷,但不保证正确性。

您的代码中仍可能有未定义的行为,并且未定义的行为在不同平台上的表现可能不同,包括在一个平台上泄漏内存,而在另一个平台上没有。

【讨论】:

  • 确实,这就是我精确“根据 Valgrind”的原因。
【解决方案3】:

如果你有条件编译的代码(例如#if defined (OS_LINUX))那么 您肯定需要确保每个平台都不会泄漏。

注意:这不是一个完整的答案,只是我想到的一个案例。

【讨论】:

  • 确实,我没有想到这一点。在这种情况下,C++ 代码示例是微不足道的。我编辑了我的问题,只关注与平台无关的 C++ 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
相关资源
最近更新 更多