4

语境

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

问题

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

精度(感谢评论和回答)

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

3 回答 3

3

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

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

于 2013-08-29T09:28:42.133 回答
3

您可以非常确定通用代码没有泄漏,但是当然,如​​果您有一个大小合适的应用程序,很可能您的某些代码特定于 Linux,其他位特定于 Windows,而某些部分特定于操作系统X。

Valgrind 不会对那些不特定于 Linux 的部分进行测试。

因此,如果您有一些代码可以:

#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); 
 }

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

于 2013-08-29T09:33:29.007 回答
1

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

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

于 2013-08-29T09:27:56.147 回答