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ởimalloc,calloc,realloc.- Nếu
ptrlà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ằng | Giải phóng bằng |
|---|---|
malloc / calloc / realloc | free() |
new | delete |
new[] | delete[] |
std::make_unique | Tự động (RAII) |
std::make_shared | Tự động (RAII) |
std::vector, std::string | Tự độ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
newvớifree()hoặcmallocvớidelete