CONTEXT
我在Valgrind
下的代码库上为我的跨平台库运行Linux
。我正在尝试查看这是否足够,或者我是否应该在Windows
和Mac
上运行动态代码分析
问题
如果我的平台无关 C ++代码没有在Linux
泄漏(根据Valgrind
),我可以假设它没有在Windows
和Mac
上泄漏{1}}呢?如果不是,请提供独立于平台的C ++示例,而不是Linux
(根据Valgrind
)泄漏,但泄漏到Windows
和/或Mac
(选择“常见”编译器,如VC ++,GCC等中的那些。
精确度(感谢评论和回答)
答案 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)
)那么
你肯定需要确保每个平台都没有泄漏。
注意:这不是一个完整的答案,只是我想到的一个案例。