2

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 ();
    }
4

0 回答 0