GMP 库:mpz_clear() 在通过引用传递并使用 malloc 分配所有内容后出现内存管理问题
GMP lib : mpz_clear() memory managment trouble after passing by reference and allocating everything with malloc
我正在尝试使用 mpz_t 的数组。
我将两个数组 set_e1
和 set_e2
传递给一个函数,该函数将初始化它们并用 mpz_t 整数填充它们(我在代码中调用 "signatures")。
如文档所述,我们可以使用 mpz_clear() 释放 mpz_init() 分配的内存。
当我在函数内部清除时,这很有效,如果我在函数之后使用它们 (free() invalid pointer
),则效果不佳。由于一切都是动态分配的,我应该能够在函数之后访问它。
我不确定我做错了什么,为什么 mpz_clear 在 generate_training_sets
中使用它时有效,但如果我在 main
中调用 [=] 后使用它则无效15=].
代码如下:
unsigned long generate_training_sets(mpz_t *set_e1, mpz_t *set_e2) {
char *samples_dir[2] = {SAMPLE_PATH_1, SAMPLE_PATH_2};
long nb_samples = 0;
char *filename = NULL;
attributes *ref_b = load_attributes("out_b");
attributes *ref_m = load_attributes("out_m");
for (size_t i = 0; i < 2; i++) {
nb_samples += d_nb_files(samples_dir[i]);
}
set_e1 = malloc(nb_samples * sizeof(mpz_t));
set_e2 = malloc(nb_samples * sizeof(mpz_t));
if (!set_e1 || !set_e2) {handle_error("malloc sets");}
for (size_t i = 0; i < nb_samples; i++) {
mpz_init2(set_e1[i], MAX_SIG_SIZE); // MAX_SIG_SIZE 6000
mpz_init2(set_e2[i], MAX_SIG_SIZE);
}
int j = 0;
for (size_t i = 0; i < 2; i++) {
mpz_t *sig_ex = malloc(sizeof(mpz_t));
mpz_t *sig_g = malloc(sizeof(mpz_t));
if (!sig_exports || !sig_5grams) handle_error("Malloc signatures");
mpz_init(*sig_ex);
mpz_init(*sig_g);
get_signature_ex("somepath", ref, *sig_ex);
get_signature_g("somepath", ref, *sig_g);
mpz_set(set_e1[j], *sig_ex);
mpz_set(set_e2[j], *sig_g);
}
ref_b->free(ref_b);
ref_m->free(ref_m);
return nb_samples;
}
int main(int argc, char const *argv[]) {
mpz_t *set_e1;
mpz_t *set_e2;
unsigned long nb_samples = 0;
nb_samples = generate_training_sets(set_e1, set_e2);
// for (size_t i = 0; i < nb_samples; i++) {
// print_sig(set_e1[i]); // doesn't work outside the function too for some reason?
// }
/* clear stuff */
for (size_t i = 0; i < nb_samples; i++) {
printf("%ld\n", i);
mpz_clear(set_e1[i]);
mpz_clear(set_e2[i]);
}
return 0;
}
我找到的一个解决方案是初始化 mpz_t
数组 ,然后 将它传递给我的函数,使用:
mpz_t *set_1 = malloc(nb_samples * sizeof(mpz_t));
mpz_t *set_2 = malloc(nb_samples * sizeof(mpz_t));
这也允许对它们使用 mpz_clear
方法。
我正在尝试使用 mpz_t 的数组。
我将两个数组 set_e1
和 set_e2
传递给一个函数,该函数将初始化它们并用 mpz_t 整数填充它们(我在代码中调用 "signatures")。
如文档所述,我们可以使用 mpz_clear() 释放 mpz_init() 分配的内存。
当我在函数内部清除时,这很有效,如果我在函数之后使用它们 (free() invalid pointer
),则效果不佳。由于一切都是动态分配的,我应该能够在函数之后访问它。
我不确定我做错了什么,为什么 mpz_clear 在 generate_training_sets
中使用它时有效,但如果我在 main
中调用 [=] 后使用它则无效15=].
代码如下:
unsigned long generate_training_sets(mpz_t *set_e1, mpz_t *set_e2) {
char *samples_dir[2] = {SAMPLE_PATH_1, SAMPLE_PATH_2};
long nb_samples = 0;
char *filename = NULL;
attributes *ref_b = load_attributes("out_b");
attributes *ref_m = load_attributes("out_m");
for (size_t i = 0; i < 2; i++) {
nb_samples += d_nb_files(samples_dir[i]);
}
set_e1 = malloc(nb_samples * sizeof(mpz_t));
set_e2 = malloc(nb_samples * sizeof(mpz_t));
if (!set_e1 || !set_e2) {handle_error("malloc sets");}
for (size_t i = 0; i < nb_samples; i++) {
mpz_init2(set_e1[i], MAX_SIG_SIZE); // MAX_SIG_SIZE 6000
mpz_init2(set_e2[i], MAX_SIG_SIZE);
}
int j = 0;
for (size_t i = 0; i < 2; i++) {
mpz_t *sig_ex = malloc(sizeof(mpz_t));
mpz_t *sig_g = malloc(sizeof(mpz_t));
if (!sig_exports || !sig_5grams) handle_error("Malloc signatures");
mpz_init(*sig_ex);
mpz_init(*sig_g);
get_signature_ex("somepath", ref, *sig_ex);
get_signature_g("somepath", ref, *sig_g);
mpz_set(set_e1[j], *sig_ex);
mpz_set(set_e2[j], *sig_g);
}
ref_b->free(ref_b);
ref_m->free(ref_m);
return nb_samples;
}
int main(int argc, char const *argv[]) {
mpz_t *set_e1;
mpz_t *set_e2;
unsigned long nb_samples = 0;
nb_samples = generate_training_sets(set_e1, set_e2);
// for (size_t i = 0; i < nb_samples; i++) {
// print_sig(set_e1[i]); // doesn't work outside the function too for some reason?
// }
/* clear stuff */
for (size_t i = 0; i < nb_samples; i++) {
printf("%ld\n", i);
mpz_clear(set_e1[i]);
mpz_clear(set_e2[i]);
}
return 0;
}
我找到的一个解决方案是初始化 mpz_t
数组 ,然后 将它传递给我的函数,使用:
mpz_t *set_1 = malloc(nb_samples * sizeof(mpz_t));
mpz_t *set_2 = malloc(nb_samples * sizeof(mpz_t));
这也允许对它们使用 mpz_clear
方法。