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

OS dependent C++ memory leaks?

本文关键字:内存 泄漏 C++ 操作系统 依赖于      更新时间:2023-10-16

上下文

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

问题

如果我的平台无关C++代码在Linux上没有泄漏(根据Valgrind),我能假设它在WindowsMac上也没有泄漏吗?如果没有,请提供一个独立于平台的C++样本,该样本在Linux上没有泄漏(根据Valgrind),但在Windows和/或Mac上泄漏(选择"常用"编译器,如VC++、GCC等中的编译器)。

精度(感谢评论和回答)

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

你可以很确定通用代码没有泄漏,但当然,如果你有一个相当大的应用程序,你的一些代码很可能是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有助于发现缺陷,但不能保证正确性

你的代码中仍然可能有未定义的行为,而这种未定义行为可能在不同的平台上表现得不同,包括在一个平台上泄露内存,而在另一个平台则不然。

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

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