Bagaimana cara membebaskan seluruh larik yang elemennya telah dialokasikan memori secara individual melalui panggilan ke malloc / calloc [duplikat]
Dari apa yang saya tahu, malloc dan calloc hanyalah pembukuan API pada memori yang mendasarinya. Dengan mengingat hal ini, saya bertanya-tanya apakah panggilan ke free () akan membebaskan seluruh array yang elemen individualnya telah dialokasikan memori melalui panggilan independen ke malloc (atau calloc).
Tepatnya, saya memiliki kode berikut:
int *num,* num_start;
num_start=num;
for(i=0;i<N;i++)
{
num = (int *)calloc(0, sizeof(int));
num++;
}
free(num_start);
Akan free(num_start)
membebaskan seluruh array dari elemen integer N yang telah dialokasikan ruang secara dinamis, secara independen?
Jawaban
"Kode" yang Anda posting tidak masuk akal dan salah.
int *num, num_start;
num_start=num;
num_start adalah integer bukan pointer.
for(i=0;i<N;i++)
{
num = (int *)calloc(0, sizeof(int));
num++;
}
sejujurnya saya tidak mengerti apa yang seharusnya dilakukan kode ini, tapi yang pasti salah
jika Anda ingin mengalokasikan memori untuk N
integer
int *num = calloc(N, sizeof(*num));
dan untuk membebaskan Anda hanya perlu
free(num);
Atau jika Anda ingin mengalokasikan pointer untuk menyimpan pointer N ke bilangan bulat N.
int **allocate(size_t N)
{
int **num = malloc(N * sizeof(*num));
for(size_t i=0; i<N; i++)
{
num[i] = calloc(N, sizeof(**num));
}
return num;
}
void arrayfree(int **num, size_t size)
{
for(size_t i = 0; i < size; i++)
{
free(num[i]);
}
free(num);
}
Ketika Anda mengalokasikan memori, Anda harus memeriksa apakah operasi itu berhasil. Pemeriksaan tersebut tidak disertakan dalam contoh untuk membuat kode lebih mudah dibaca.
Fungsi calloc()
dan malloc()
mengembalikan pointer ke alokasi yang berfungsi ganda sebagai pegangan untuk melepaskan memori itu. Sementara Anda bebas untuk membuat salinan dari pointer itu dan memanipulasi mereka sesuai keinginan Anda, ketika Anda menelepon untuk free()
Anda harus memberikan yang asli nilai .
Artinya ini berhasil:
// Original allocation
int* x = calloc(42, sizeof(int));
// Making a new (independent) copy of the pointer to a new pointer
int* p = x;
// Arbitrary pointer manipulation and mangling
x++;
// Freeing with the copied value
free(p);
Anda juga bisa sedikit berpetualang, selama Anda kembali ke tujuan awal Anda:
int* x = calloc(42, sizeof(int));
x += 40;
x -= 30;
x += 10;
x -= 13;
x -= 7;
free(x);
Dimana disini x
telah kembali ke nilai aslinya setelah melalui perjalanan singkat. Dalam praktik umum, lebih baik mempertahankan penunjuk asli daripada harus merekonstruksinya nanti. Buat salinan jika Anda berniat memanipulasinya.