🔍 Vấn đề: new/delete và những cái bẫy trí nhớ
Trong C++, nếu bạn dùng new để cấp phát bộ nhớ mà quên delete, bạn đã tạo ra memory leak – vùng nhớ không được giải phóng.
void foo() {
int* ptr = new int(10);
// làm gì đó với ptr
// quên delete ptr => leak
}
Vấn đề càng nghiêm trọng khi có nhiều lối thoát hàm, xử lý lỗi, hay thậm chí throw.
🧪 Giải pháp hiện đại: Smart Pointer
Từ C++11 trở đi, bạn không cần phải tự tay delete nữa. Hãy để smart pointer làm điều đó!
#include <memory>
void foo() {
std::unique_ptr<int> ptr = std::make_unique<int>(10);
// Không cần delete – tự động xoá khi ra khỏi scope
}
Các loại smart pointer phổ biến:
| Loại | Mô tả ngắn |
unique_ptr | Sở hữu độc quyền, không copy được |
| shared_ptr | Dùng chung, đếm số lượng tham chiếu |
| weak_ptr | Tránh vòng tham chiếu với shared_ptr |
⚙️ Khi nào dùng loại nào?
unique_ptr: mặc định nên dùng nếu bạn không chia sẻ ownership.shared_ptr: dùng khi nhiều phần cùng cần quản lý cùng 1 tài nguyên.weak_ptr: đi chung vớishared_ptrđể tránh vòng lặp.
Ví dụ với shared_ptr:
#include <memory>
#include <iostream>
void foo() {
std::shared_ptr<int> a = std::make_shared<int>(5);
std::shared_ptr<int> b = a; // b và a cùng quản lý 1 vùng nhớ
std::cout << *b << "\n";
}
🎯 Vì sao smart pointer là “chuẩn” C++ hiện đại?
- An toàn hơn
new/delete - Tự động giải phóng tài nguyên
- Dễ maintain, ít bug về memory
- Dễ phối hợp với các container như
std::vector,std::map
📌 Gợi ý cho bạn
Nếu bạn từng:
- Vướng lỗi memory leak
- Quên
delete - Dùng
try-catchvà crash vì quên dọn bộ nhớ
Thì hãy bắt đầu dùng smart pointer từ hôm nay!
📌 Gợi ý đọc thêm:
- RAII – Quy tắc vàng giúp quản lý tài nguyên an toàn trong C++
- Quản lý vùng nhớ cấp phát động trong C/C++

One thought on “Smart Pointer – Cứu tinh quản lý bộ nhớ trong C++”