Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Cách hoạt động của malloc() và free() trong C/C++

malloc() - Cấp phát bộ nhớ động

Cấp phát size byte trên heap, trả về con trỏ void* trỏ đến byte đầu. Trả về NULL nếu thất bại.

Cú pháp

void* malloc(size_t size);

Sử dụng điển hình

int* ptr = (int*)malloc(n * sizeof(int));
if (!ptr) {
    // Xử lý lỗi hết bộ nhớ
    return -1;
}

Ví dụ malloc()

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 4;
    int *p = (int*)malloc(n * sizeof(int));
    
    if (p == NULL) {
        printf("Lỗi: Không cấp phát được bộ nhớ\n");
        return 1;
    }
    
    printf("Nhập %d số: ", n);
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        scanf("%d", p + i);
        sum += *(p + i);
    }
    
    printf("Tổng: %d\n", sum);
    free(p); // Quan trọng: giải phóng!
    return 0;
}

Kết quả

Nhập 4 số: 32 23 21 8
Tổng: 84

free() - Giải phóng bộ nhớ

Giải phóng bộ nhớ đã cấp phát bởi malloc, calloc, realloc. Không thay đổi giá trị con trỏ (con trỏ vẫn trỏ địa chỉ cũ - dangling pointer).

Cú pháp

void free(void* ptr);

Ví dụ free()

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 4;
    int *p = (int*)malloc(n * sizeof(int));
    
    if (!p) { printf("Lỗi malloc\n"); return 1; }
    
    // ... sử dụng p ...
    
    free(p);        // Giải phóng
    p = NULL;       // TỐT: tránh dangling pointer
    
    // free(NULL) an toàn - không làm gì
    free(p);        // OK
    
    return 0;
}

Lỗi thường gặp

C++: Nên dùng new/delete hoặc Smart Pointer

// C++ style
int* p = new int[10];
delete[] p;

// Hiện đại (C++11+) - Tự động quản lý
std::unique_ptr p(new int[10]);
std::vector v(10); // Khuyến nghị nhất
LỗiHậu quảKhắc phục
Quên free()Memory leakLuôn free, dùng RAII/smart pointer
Double freeHeap corruption, crashSet NULL sau free
Free con trỏ không phải mallocUB, crashChỉ free con trỏ từ malloc/calloc/realloc
Sử dụng sau freeUB, data corruptionSet NULL, static analysis
Không check NULLCrash khi dereferenceLuôn check trước khi dùng