Smart pointers trong C++

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_ptr dù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ạiKhi nào dùngVí dụ
unique_ptrMột đối tượng chỉ có một chủ sở hữuQuản lý tài nguyên trong class
shared_ptrNhiề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_ptrQuan sát đối tượng nhưng không giữ sốngTránh vòng tham chiếu trong shared_ptr

Leave a Comment