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

C++ 依赖操作系统的C++;内存泄漏?,c++,linux,windows,macos,memory-leaks,C++,Linux,Windows,Macos,Memory Leaks,上下文 我在Linux下的代码库上为我的跨平台库运行Valgrind。我想看看这是否足够,或者我是否也应该在Windows和Mac上运行动态代码分析 问题 > 我的平台无关 C++代码不泄漏在 Linux < /C> >(根据 Valgrind >,我可以假定它不是在代码> Windows 和 Mac < /C>中泄露的吗?如果没有,请提供一个独立于平台的C++实例,不在 Linux > /Cube >(根据 Valgrind >),但泄漏在 Windows < />代码>和/或 MAC

上下文

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

问题

<> > <强>我的平台无关<强> C++代码不泄漏在<代码> Linux < /C> >(根据<代码> Valgrind <代码> >,我可以假定它不是在代码> Windows 和 Mac < /C>中泄露的吗?如果没有,请提供一个独立于平台的C++实例,不在 Linux > /Cube >(根据<代码> Valgrind <代码> >),但泄漏在<代码> Windows < />代码>和/或<代码> MAC < /代码>(选择“普通”编译器,如VC++、GCC等)。 精确性(感谢评论和回答)

  • 我对平台无关的C++代码感兴趣(所以不含IFIFF等);李> 我认为C++代码是我自己的,不是第三方代码的;李> 我认为Valgrind是真实的真理,但我可以考虑任何其他的工具。我知道没有工具可以检测所有内存泄漏

  • 如果您有条件编译的代码(例如
    #如果已定义(OS_LINUX)
    ),则 您当然需要确保每个平台都没有泄漏


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

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


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

    您可以非常确定通用代码没有泄漏,但当然,如果您的应用程序大小合适,很可能您的一些代码特定于Linux,其他一些特定于Windows,还有一些特定于OSX

    那些不特定于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()
     {
        vector<int> v;
        for(;;)
           v.push_back(1); 
     }
    
    void func()
    {
    向量v;
    对于(;;)
    v、 推回(1);
    }
    

    因为记忆仍然被某些东西“拥有”。当然,这个特殊的例子非常极端,但是你也可以有类似的情况,代码存储了一些东西,只是向存储中添加了越来越多的项,而且永远不要删除它们。

    如果您有平台相关的代码或使用平台相关的第三方库,您肯定也应该在
    Windows
    Mac
    上运行valgrind分析。因为即使是编译器也依赖于平台,并且可能包含依赖于平台的bug->运行valgrind。真的!我只把问题集中在独立于平台的C++代码上,我只考虑C++代码。不是第三方库中的一个。哦,别忘了实现错误,它可能会触发C++代码中的漏洞,虽然那只是运气不好。@ RuNVB:我不“拥有”这个代码;事实上,这就是为什么我“根据瓦尔格兰德”进行估值。事实上,我并没有想到这一点。C++代码示例在上下文中是微不足道的。我编辑了我的问题,只关注独立于平台的C++代码。我要求平台无关代码^ ^。查看我的编辑。此外,我还精确地计算了“根据Valgrind”
     void func()
     {
        vector<int> v;
        for(;;)
           v.push_back(1); 
     }