ฉันจะปลดปล่อยอาร์เรย์ทั้งหมดที่องค์ประกอบได้รับการจัดสรรหน่วยความจำแยกกันผ่านการโทรไปยัง malloc / calloc [ซ้ำ] ได้อย่างไร
จากสิ่งที่ฉันรู้ malloc และ calloc เป็นเพียงหนังสือที่เก็บ API ไว้ในหน่วยความจำพื้นฐาน โปรดจำไว้ว่าฉันสงสัยว่าการโทรฟรี () จะทำให้อาร์เรย์ทั้งหมดว่างซึ่งองค์ประกอบแต่ละรายการได้รับการจัดสรรหน่วยความจำผ่านการเรียกอิสระไปยัง malloc (หรือ calloc)
แน่นอนฉันมีรหัสต่อไปนี้:
int *num,* num_start;
num_start=num;
for(i=0;i<N;i++)
{
num = (int *)calloc(0, sizeof(int));
num++;
}
free(num_start);
จะfree(num_start)
เพิ่มอาร์เรย์ขององค์ประกอบจำนวนเต็ม N ทั้งหมดซึ่งได้รับการจัดสรรพื้นที่แบบไดนามิกโดยอิสระหรือไม่?
คำตอบ
"รหัส" ที่คุณโพสต์ไม่สมเหตุสมผลและไม่ถูกต้อง
int *num, num_start;
num_start=num;
num_start เป็นจำนวนเต็มไม่ใช่ตัวชี้
for(i=0;i<N;i++)
{
num = (int *)calloc(0, sizeof(int));
num++;
}
พูดตามตรงฉันไม่เข้าใจว่ารหัสนี้ควรจะทำอย่างไร แต่แน่นอนว่าผิด
หากคุณต้องการจัดสรรหน่วยความจำสำหรับN
จำนวนเต็ม
int *num = calloc(N, sizeof(*num));
และปลดปล่อยคุณเพียงแค่ต้องการ
free(num);
หรือถ้าคุณต้องการจัดสรรพอยน์เตอร์เพื่อจัดเก็บ N พอยน์เตอร์เป็น 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);
}
เมื่อคุณจัดสรรหน่วยความจำคุณต้องตรวจสอบว่าการดำเนินการสำเร็จหรือไม่ การตรวจสอบเหล่านี้ไม่รวมอยู่ในตัวอย่างเพื่อให้อ่านโค้ดได้ง่ายขึ้น
calloc()
และmalloc()
ฟังก์ชั่นกลับชี้ไปจัดสรรคู่ผสมซึ่งเป็นที่จับไปปล่อยหน่วยความจำว่า ขณะที่คุณกำลังอิสระที่จะทำสำเนาของตัวชี้ที่และจัดการกับผู้ที่คุณเห็นพอดีเมื่อคุณโทรไปfree()
คุณจะต้องให้เดิมค่า
กล่าวคือใช้งานได้:
// 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);
นอกจากนี้คุณยังสามารถผจญภัยได้ตราบเท่าที่คุณกลับไปยังจุดหมายเดิม:
int* x = calloc(42, sizeof(int));
x += 40;
x -= 30;
x += 10;
x -= 13;
x -= 7;
free(x);
ที่นี่x
กลับสู่คุณค่าเดิมหลังจากเดินทางไม่นาน โดยทั่วไปแล้วควรรักษาตัวชี้เดิมไว้ดีกว่าที่จะต้องสร้างใหม่ในภายหลัง ทำสำเนาหากคุณตั้งใจจะจัดการ