析构函数中的mpfr_free_缓存-一个好主意? 我需要在C++程序中任意精度,所以我使用众所周知的轻量级C++包装器MPRFC++在多精度浮点C库MPFR上使用<

析构函数中的mpfr_free_缓存-一个好主意? 我需要在C++程序中任意精度,所以我使用众所周知的轻量级C++包装器MPRFC++在多精度浮点C库MPFR上使用< ,c++,multithreading,malloc,arbitrary-precision,mpfr,C++,Multithreading,Malloc,Arbitrary Precision,Mpfr,我一直有记忆问题。也就是说,malloc在MPFR函数中失败。如果您感兴趣,请在底部显示一小段错误消息 MPFR手册第10页 MPFR函数可以创建缓存,例如,在计算诸如pi之类的常数时,这是因为用户直接调用了诸如MPFR_const_pi之类的函数,或者是因为MPFR库本身在内部调用了此类函数来计算某些其他函数 用户可以随时使用mpfr_free_cache释放各种缓存。强烈建议在终止线程之前执行此操作 我的程序是多线程的,所以我想我需要开始使用这个mpfr\u-free\u缓存 问题: 我可以

我一直有记忆问题。也就是说,malloc在MPFR函数中失败。如果您感兴趣,请在底部显示一小段错误消息

MPFR手册第10页

MPFR函数可以创建缓存,例如,在计算诸如pi之类的常数时,这是因为用户直接调用了诸如MPFR_const_pi之类的函数,或者是因为MPFR库本身在内部调用了此类函数来计算某些其他函数

用户可以随时使用mpfr_free_cache释放各种缓存。强烈建议在终止线程之前执行此操作

我的程序是多线程的,所以我想我需要开始使用这个mpfr\u-free\u缓存

问题: 我可以简单地将mpfr_free_缓存放在包装类的析构函数中吗?这是安全和良好的做法吗?这足以解决问题吗?假设我已正确识别内存泄漏

e、 g

//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循环并压缩在mpfr\u空闲\u缓存中的想法并不太兴奋

注意:我使用线程安全选项构建了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 ();
    }

我认为问题在于,您似乎试图分配5.8TB的内存。没有多少系统能够满足分配请求。。。。你需要看看大小是从哪里来的,它是如何变得那么大的…是的,我注意到了,并且不确定该怎么做-这行出现在MPFR函数中,用于临时计算,所以我无法控制它…你可能无法控制代码,但如果你将大小追溯到它的计算位置,您可能会发现它是基于您以某种方式提供给MPFR的值,或者它可能是一个实际的MPFR错误。找出哪一个至少能让问题更清楚…同意。不幸的是,valgrind使程序难以置信地慢。。。所以我可以做追踪,下周也许会告诉你:事实上。我用valgrind运行了它,但在-leak check=full和-track origins=yes这两个选项中都没有找到任何结果。程序中止,valgrind无话可说。我认为问题在于您似乎试图分配5.8TB的内存。没有多少系统能够满足分配请求。。。。你需要看看大小是从哪里来的,它是如何变得那么大的…是的,我注意到了,并且不确定该怎么做-这行出现在MPFR函数中,用于临时计算,所以我无法控制它…你可能无法控制代码,但如果你将大小追溯到它的计算位置,您可能会发现它是基于您以某种方式提供给MPFR的值,或者它可能是一个实际的MPFR错误。找出哪一个至少能让问题更清楚…同意。不幸的是,valgrind使程序难以置信地慢。。。所以我可以做追踪,下周也许会告诉你:事实上。我用valgrind运行了它,但在-leak check=full和-track origins=yes这两个选项中都没有找到任何结果。程序中止了,valgrind无话可说。