ฉันจะปลดปล่อยอาร์เรย์ทั้งหมดที่องค์ประกอบได้รับการจัดสรรหน่วยความจำแยกกันผ่านการโทรไปยัง malloc / calloc [ซ้ำ] ได้อย่างไร

Aug 16 2020

จากสิ่งที่ฉันรู้ 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 ทั้งหมดซึ่งได้รับการจัดสรรพื้นที่แบบไดนามิกโดยอิสระหรือไม่?

คำตอบ

1 P__JsupportswomeninPoland Aug 16 2020 at 10:09

"รหัส" ที่คุณโพสต์ไม่สมเหตุสมผลและไม่ถูกต้อง

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);
}

เมื่อคุณจัดสรรหน่วยความจำคุณต้องตรวจสอบว่าการดำเนินการสำเร็จหรือไม่ การตรวจสอบเหล่านี้ไม่รวมอยู่ในตัวอย่างเพื่อให้อ่านโค้ดได้ง่ายขึ้น

tadman Aug 16 2020 at 09:55

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กลับสู่คุณค่าเดิมหลังจากเดินทางไม่นาน โดยทั่วไปแล้วควรรักษาตัวชี้เดิมไว้ดีกว่าที่จะต้องสร้างใหม่ในภายหลัง ทำสำเนาหากคุณตั้งใจจะจัดการ