昨天,我发布了一个关于[从FC3 x86_32到FC20 x86_64的内存泄漏](Where do I starting to find the memory leak after porting from i386 to x86_64?)的问题,我希望valgrind
能帮我找到错误(有人也给了我同样的建议) ),但valgrind
对此无能为力。现在我找到了原因:
在X86_32中,sizeof(size_t)= 4与sizeof(unsigned int)= 4的字节数相同,但在X86_64中,sizeof(size_t)= 8与sizeof(unsigned int)不同= 4。
因此,当我们使用比较运算符相对于size_t
和unsinged int
时必须小心
例如,std::string::npos
的定义是static const size_t npos = -1;
,引用here。
在FC3 X86_32
中,以下c ++代码是可以的,因为
found == std::string::npos == 4294967295
:
int main ()
{
std::string str ("There are two needles in this haystack with needles.");
unsigned int found = str.find("haystackx");
while(found != std::string::npos){
std::cout << "loop forever" << std::endl;
}
}
但是,在FC20 X86_64
中,由于found = 4294967295
,此代码将永远进入循环
std::string::npos = 18446744073709551615
。
这个loop forever
是我的内存泄漏的原因,因为在我的项目循环中,存在大量的内存分配。我不认为valgrind
可以帮助我找到这种错误。还有其他方法吗?或者我必须错过关于valgrind
的一些事情?