Trang tài liệu
Khóa học C++ nền tảng
Chương 6. Con trỏ và tham chiếu
Con trỏ dùng chung

Con trỏ dùng chung

shared_ptr là một loại con trỏ thông minh trong C++ cho phép nhiều con trỏ chia sẻ quyền sở hữu đối tượng được cấp phát động. Đối tượng sẽ chỉ được hủy cấp phát tự động khi shared_ptr cuối cùng trỏ tới nó bị hủy.

Khi sử dụng shared_ptr, bộ đếm tham chiếu sẽ tự động tăng lên mỗi khi một con trỏ mới được tạo và giảm đi khi mỗi con trỏ vượt ra ngoài phạm vi. Khi bộ đếm tham chiếu về 0, hệ thống sẽ dọn sạch bộ nhớ.

Mã code ví dụ

Đây là một ví dụ về cách sử dụng shared_ptr:

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "Constructor is called." << std::endl; }
    ~MyClass() { std::cout << "Destructor is called." << std::endl; }
};

int main() {
    // tạo một con trỏ dùng chung để quản lý đối tượng MyClass
    std::shared_ptr<MyClass> ptr1(new MyClass());
    
    {
        // tạo một con trỏ dùng chung khác và khởi tạo nó với con trỏ đã tạo trước đó
        std::shared_ptr<MyClass> ptr2 = ptr1;

        std::cout << "Inside the inner scope." << std::endl;
        // cả hai con trỏ đều chia sẻ cùng một đối tượng và bộ đếm tham chiếu đã được tăng lên 2
    }

    std::cout << "Outside the inner scope." << std::endl;
    // rời khỏi phạm vi bên trong sẽ phá hủy ptr2 và bộ đếm tham chiếu được giảm xuống 1
    
    // hàm chính trả về, ptr1 vượt ra ngoài phạm vi và bộ đếm tham chiếu trở thành 0
     // điều này khiến đối tượng MyClass bị xóa và hàm hủy được gọi
}

Đầu ra:

Constructor is called.
Inside the inner scope.
Outside the inner scope.
Destructor is called.

Trong ví dụ này, ptr1 và ptr2 chia sẻ quyền sở hữu của cùng một đối tượng. Đối tượng chỉ bị hủy khi cả hai con trỏ vượt ra ngoài phạm vi và bộ đếm tham chiếu trở thành số không.