操作系统依赖C ++内存泄漏?

时间:2013-08-29 09:20:07

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

CONTEXT

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

问题

如果我的平台无关 C ++代码没有在Linux泄漏(根据Valgrind),我可以假设它没有在WindowsMac上泄漏{1}}呢?如果不是,请提供独立于平台的C ++示例,而不是Linux(根据Valgrind)泄漏,但泄漏到Windows和/或Mac(选择“常见”编译器,如VC ++,GCC等中的那些。

精确度(感谢评论和回答)

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

3 个答案:

答案 0 :(得分:3)

valgrind有助于发现漏洞,但不保证正确性。

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

答案 1 :(得分:3)

你可以非常肯定通用代码没有泄漏,当然,如果你有一个不错的大小应用程序,很可能你的某些代码是特定于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); 
 }

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

答案 2 :(得分:1)

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

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