私のコードでは、ポインタ(例:float **変数)へのポインタがいくつかありますが、メモリリークを引き起こさないようにメモリを解放する問題があるようです。ここで私が書いたコードは次のとおりです。Cポインタをポインタに解放する
float *one, **part1, **part2;
one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);
if(one == NULL || part1 == NULL) {
printf("Memory error.\n");
exit(2);
}
for(k = 0; k < nx; k++)
part1[k] = &one[k * nx];
one = malloc(sizeof(&one) * nx * nx);
part2 = malloc(sizeof(&part2) * nx);
if(one == NULL || part2 == NULL) {
printf("Memory error.\n");
exit(2);
}
for(k = 0; k < nx; k++)
part2[k] = &one[k * nx];
... (Other code here)
for(k = 0; k < nx; k++) {
free(part1[k]);
free(part2[k]);
}
free(one);
free(part1);
free(part2);
このコードは、通るの計算を正確に行いますが、その後、自由なループでエラーが出て。 k = 0で動作しますが、part1 [1]とpart2 [1]を解放しようとすると、 "glibc detected"エラーが表示されます。
メモリが連続していないので、これをやりたくありませんでしたか?私はこれが効率のいくらかの損失を引き起こすと信じています。明らかに、非効率的に作業することはまったく動作しないよりも優れていますが、私はこれをこのように動作させようとしていました。また、ポインタをpart1 [0]以上のものに保存します。私の最初のループは、kが0からnxになるので、part1 [k]にポインタを保存します。そのため、同じ量のメモリを解放しようとしました。 – wolfPack88
"私の最初のループは、kが0からnxになるので、part1 [k]にポインタを保存します。"いいえ、あなたは_offsets_を1つ保存します。 &one [0] = one。 &one [k] = one + k。 free(1)は空き領域のようにメモリ全体を解放します(part1 [0])。 – wnoise
ああ...それは意味をなさない。お手伝いありがとう。 – wolfPack88