Raw pointer
#include <iostream>
using namespace std;
int main() {
// new: cấp phát động trên heap, trả về con trỏ đến vùng nhớ vừa tạo.
// Nếu bỏ new, bạn chỉ có thể khai báo biến bình thường trên stack
// int num = 100; // biến thường, không phải con trỏ
int* ptr = new int(100);
cout << "Value: " << *ptr << endl; // 100
delete ptr; // phải nhớ giải phóng thủ công
}Các loại smart pointers
// unique_ptr
#include <iostream>
#include <memory>
using namespace std;
int main() {
unique_ptr<int> pointer = make_unique<int>(100);
cout << "Value: " << *pointer << endl; // 100
// Không cần delete, tự động giải phóng khi ra khỏi scope
}// shared_ptr
#include <iostream>
#include <memory>
using namespace std;
int main() {
shared_ptr<int> pointer = make_shared<int>(100);
cout << "Value: " << *pointer << endl; // 100
// Không cần delete, tự động giải phóng khi ra khỏi scope
}// weak_ptr
#include <iostream>
#include <memory>
using namespace std;
int main() {
shared_ptr<int> owner = make_shared<int>(100);
weak_ptr<int> pointer = owner; // chỉ quan sát, không sở hữu
if (auto locked = pointer.lock()) {
cout << "Value: " << *locked << endl; // 100
}
// Không cần delete, tự động giải phóng khi ra khỏi scope
}✅ Ưu điểm
- Quản lý bộ nhớ tự động → tránh quên
delete. - An toàn với exception → không bị rò rỉ khi lỗi xảy ra.
- Rõ ràng quyền sở hữu → biết ai chịu trách nhiệm giải phóng.
- Tránh lỗi double delete và dangling pointer.
⚠️ Nhược điểm
- Chi phí hiệu năng:
shared_ptrdùng reference count → chậm hơn con trỏ thô. - Phức tạp hơn: cần hiểu rõ ownership để tránh vòng tham chiếu.
- Không thay thế hoàn toàn: vẫn cần con trỏ thô cho truy cập không sở hữu.
| Loại | Khi nào dùng | Ví dụ |
|---|---|---|
| unique_ptr | Một đối tượng chỉ có một chủ sở hữu | Quản lý tài nguyên trong class |
| shared_ptr | Nhiều đối tượng cùng quản lý tài nguyên | Đồ thị, cây, nhiều module cùng tham chiếu |
| weak_ptr | Quan sát đối tượng nhưng không giữ sống | Tránh vòng tham chiếu trong shared_ptr |