还有什么方法可以找到从FC3 X86_32到FC20 X86_64的移植问题?

时间:2014-09-19 04:19:26

标签: c++ c porting

昨天,我发布了一个关于[从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_tunsinged 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的一些事情?

0 个答案:

没有答案