如何完全释放为GMP mpz_t / mpz_class的数组/向量分配的内存?

时间:2018-01-02 17:17:30

标签: c++ c memory-management gmp

我需要处理mpz_t的大数组并释放后记忆。但是,在使用htop命令在每个阶段分析RSS时,mpz_clear似乎不会完全释放内存。

以下是示例C代码:

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>

int main(void) {
    mpz_t *A;
    int size = 1<<20;
    A = (mpz_t *) malloc(size*sizeof(mpz_t));
    getchar(); // RSS=876KB

    for (int i=0; i<size; i++) {
        mpz_init_set_ui(A[i],0);
    }
    getchar(); // RSS=50MB

    for (int i=0; i<size; i++) {
        mpz_clear(A[i]);
    }
    free(A);
    getchar(); // RSS=34MB!!

    return 0;
}

查看答案here,上面的内存释放过程(即在mpz_clear元素&amp; mpz_t数组上调用free)已正确完成。

我也尝试使用mpz_class C ++包装器的向量,如下所示,导致相同的情况。

#include <gmpxx.h>
#include <iostream>
#include <vector>

int main(void) {
    std::vector<mpz_class> A;
    int size = 1 << 20;
    A.reserve(size);
    std::cin.ignore();

    for (int i=0; i<(size); i++) {
        A.emplace_back(0);
    }
    std::cin.ignore();

    std::vector<mpz_class>().swap(A);
    std::cin.ignore();

    return 0;
}

有没有办法释放为mpz_t数组分配的整个内存?

更新

感谢评论部分,我了解到free does not necessarily release the memory back to the OS。但在我的情况下,在Ubuntu 16.04上使用glibc,free() 确实释放malloc保留的内存量(即16 * 2 ^ 20 = 16MB,假设{{} 1}}是16字节)因为它超过了默认的M_MMAP_THRESHOLD值(= 128KB)。

所以我怀疑GMP隐式分配了一些孤立的内存(上例中≈32MB),需要单独调用sizeof(mpz_t)

0 个答案:

没有答案