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

Hàm free() trong C/C++

Hàm free() trong thư viện C (<cstdlib>) dùng để giải phóng bộ nhớ đã cấp phát động bằng malloc(), calloc(), hoặc realloc().

Cú pháp


void free(void* ptr);

Tham số

  • ptr: Con trỏ đến khối nhớ cần giải phóng. Phải là con trỏ trả về bởi malloc, calloc, realloc.
  • Nếu ptr là nullptr, free() không làm gì (an toàn).

Ví dụ đầy đủ: malloc → realloc → free

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

int main() {
    char* str;
    
    // 1. Cấp phát ban đầu: 15 bytes
    str = static_cast<char*>(malloc(15));
    if (!str) return 1;
    
    strcpy(str, "tutorialspoint");
    cout << "Chuoi = " << str << ", Dia chi = " << static_cast<void*>(str) << endl;
    
    // 2. Mở rộng bộ nhớ: 25 bytes
    str = static_cast<char*>(realloc(str, 25));
    if (!str) return 1;
    
    strcat(str, ".com");
    cout << "Chuoi = " << str << ", Dia chi = " << static_cast<void*>(str) << endl;
    
    // 3. Giải phóng bộ nhớ
    free(str);
    
    // str giờ là dangling pointer - KHÔNG được dùng
    return 0;
}

Kết quả

Chuoi = tutorialspoint, Dia chi = 0x22fe38
Chuoi = tutorialspoint.com, Dia chi = 0x22fe38

Quy tắc vàng (Rule of Three/Zero)

Cấp phát bằngGiải phóng bằng
malloc / calloc / reallocfree()
newdelete
new[]delete[]
std::make_uniqueTự động (RAII)
std::make_sharedTự động (RAII)
std::vector, std::stringTự động (RAII)

Lỗi thường gặp

  • Double free: Gọi free() hai lần trên cùng con trỏ → undefined behavior
  • Use after free: Dùng con trỏ sau khi đã free()
  • Free con trỏ không hợp lệ: Con trỏ không từ malloc/new, con trỏ giữa mảng
  • Memory leak: Quên free()

C++ hiện đại: Tránh free()/malloc()


// Thay vì:
int* arr = (int*)malloc(n * sizeof(int));
free(arr);

// Hãy dùng:
std::vector<int> arr(n);  // Tự quản lý bộ nhớ
// Hoặc:
auto arr = std::make_unique<int[]>(n);

Tóm tắt

  • free() giải phóng bộ nhớ C-style
  • Chỉ dùng cho bộ nhớ từ malloc/calloc/realloc
  • C++ hiện đại: Ưu tiên RAII (vector, unique_ptr, shared_ptr)
  • Không bao giờ mix new với free() hoặc malloc với delete