我在解决这个问题时遇到了一些麻烦......所以有时间寻求帮助。
OS:OSX,Snow Leopard
gcc:gcc的Xcode版本,4.2.1
图书馆:gmp,gmpxx
问题:一个函数在最后崩溃:
flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal SIGABRT, Aborted.
0x00007fff835cd886 in __kill ()
(gdb) bt
#0 0x00007fff835cd886 in __kill ()
#1 0x00007fff8366deae in abort ()
#2 0x00007fff83585a75 in free ()
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_ ()
Previous frame inner to this frame (gdb could not unwind past this frame)
我没有在函数 init 中调用free(),并且函数确实正确运行直到结束大括号..因此崩溃点必须在本地对象的析构函数中(右?)
有趣的是:
a)如果静态链接,程序(似乎)工作正常,只有在代码内置到* .dylib并动态加载时才会失败。
b)程序以两个完全不同的gmp / gmpxx版本以相同的方式失败。 [4.3或者其他和5.01]c)静态和动态链接版本在Ubuntu 10.5 LTS上运行良好
代码是由我的编译器生成的,它不是手写代码。用户代码由顶级驱动程序运行。系统成功运行了数百个回归测试。但是在这个特定的测试用例中使用了下面的手写代码:
namespace flx { namespace gmp {
string flx_mpf_get_str(mpf_class const &a)
{
mp_exp_t x;
std::string s = a.get_str(x,10,0);
char b[100];
std::snprintf(b,100,"e%ld",(long)x);
return std::string(".")+s+b;
}
}}
但它对我来说很好看。函数的堆栈框架包含几个mpz_class,mpq_class和mpf_class对象。
除了gmp / gmpxx中的错误之外,我能想到的另一件事是我的运行时系统或生成的代码破坏了内存。未被分配的“被释放”地址是可疑的(它远不在堆中)。我使用-g标志构建了一个gmp版本,但是没有获得更多信息(这表明它在gmpxx类析构函数中没有坏处。)
我需要一些想法!我不知道现在在哪里看。 Thx提前:))
链接到来源
http://felix-lang.org:1116/ $ /家/ skaller /菲利克斯/菲利克斯/建立/释放优化/测试/ GMP / GMP-0.cpp
Meta:SO的降价不起作用!所以你必须手工复制。也可以投入到Felix代码的链接,因为它更具可读性并且有一些有趣的东西(如用户定义的语法,如果你去图书馆,你可以看到实例化的类型类)
http://felix-lang.org:1116/ $ /家/ skaller /菲利克斯/菲利克斯/建立/释放优化/测试/ GMP / GMP-0.flx
答案 0 :(得分:0)
你从哪里获得gmp来源?它可能是32位版本(至少macports不提供64位源)。另一方面,Snow Leopard是64位(默认情况下)。
我个人通过gcc -m32将所有代码强制为32位。你可以尝试一样。
BR,
尤哈
答案 1 :(得分:0)
您无法释放动态库分配的内存。也许这就是问题所在。 看看这个答案:Shared libraries memory space