MPFRC++
我需要 C++ 程序中的任意精度,因此我在多精度浮点 C-library 上使用众所周知的轻量级 C++ 包装器MPFR
。
我一直有记忆问题。即,malloc
在 MPFR 功能内失败。(如果您有兴趣,请在底部显示一小段错误消息)。
MPFR 手册说(第 10 页)
MPFR 函数可能会创建缓存,例如,在计算诸如 pi 之类的常量时,要么是因为用户直接调用了类似 mpfr_const_pi 的函数,要么是因为 MPFR 库本身在内部调用了这样的函数来计算某个其他函数。
在任何时候,用户都可以使用 mpfr_free_cache 释放各种缓存。强烈建议在终止线程之前执行此操作...
我的程序是多线程的,所以我想我需要开始使用这个mpfr_free_cache
.
问题:
我可以简单地放入包装类mpfr_free_cache()
的析构函数吗?这是安全和良好的做法吗?是否足以解决问题?(假设我已经正确识别出内存泄漏)
例如
// mpreal.cpp - 包装器的实现
namespace mpfr {
class mpreal {
mpreal::mpreal()
{
#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC)
set_custom_malloc();
#endif
mpfr_init2(mp,default_prec);
mpfr_set_ui(mp,0,default_rnd);
MPREAL_MSVC_DEBUGVIEW_CODE;
}
.......
mpreal::~mpreal()
{
mpfr_clear(mp);
mpfr_free_cache(); // ADD THIS TO DESTRUCTOR ?!?!
}
......
我不是专业的开发人员,所以我不知道这是否真的是解决问题的最佳方法。但我对进入每个 OpenMP 多线程区域/for-loop 并挤进一个mpfr_free_cache()
...
注意:我已经使用线程安全选项构建了 MPFR。
这是错误消息,如果您有兴趣...
MPFR: Can't allocate memory (size=5864071192896)
[ccmb011:00985] *** Process received signal ***
[ccmb011:00985] Signal: Aborted (6)
[ccmb011:00985] Signal code: (-6)
[ccmb011:00985] [ 0] /lib64/libpthread.so.0 [0x2b952b8cc7c0]
[ccmb011:00985] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x2b952bb09265]
[ccmb011:00985] [ 2] /lib64/libc.so.6(abort+0x110) [0x2b952bb0ad10]
[ccmb011:00985] [ 3] /users/mmparks/MPFR/lib/libmpfr.so.4(mpfr_default_reallocate+0) [0x2b9529abebd0]
[ccmb011:00985] [ 4] /users/mmparks/MPFR/lib/libmpfr.so.4(mpfr_tmp_allocate+0x2e) [0x2b9529abec6e]
[ccmb011:00985] [ 5] /users/mmparks/MPFR/lib/libmpfr.so.4(mpfr_mul+0x69d) [0x2b9529a9c5bd]
[ccmb011:00985] [ 6] /users/mmparks/MY_PROGRAM
错误消息中引用的代码:
ret = malloc (size);
if (ret == NULL)
{
fprintf (stderr, "MPFR: Can't allocate memory (size=%lu)\n",
(unsigned long) size);
abort ();
}