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 和如果您有条件编译的代码(例如
#如果已定义(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);
}