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ỏ đặc biệt (unique_ptr)

Con trỏ đặc biệt (unique_ptr)

std::unique_ptr là một con trỏ thông minh được cung cấp bởi Thư viện chuẩn C++. Nó là một lớp mẫu được sử dụng để quản lý các đối tượng hoặc mảng đơn lẻ.

unique_ptr hoạt động dựa trên khái niệm sở hữu độc quyền - nghĩa là chỉ một unique_ptr được phép sở hữu một đối tượng tại một thời điểm. Quyền sở hữu này có thể được chuyển nhượng hoặc di chuyển nhưng không thể chia sẻ hoặc sao chép.

Khái niệm này giúp ngăn ngừa các vấn đề như con trỏ không trỏ đến một đối tượng hợp lệ thích hợp, giảm rò rỉ bộ nhớ và loại bỏ nhu cầu quản lý bộ nhớ thủ công. Khi unique_ptr vượt quá phạm vi, nó sẽ tự động xóa đối tượng mà nó sở hữu.

Hãy cùng xem một số ví dụ cơ bản về việc sử dụng unique_ptr:

Tạo một unique_ptr

#include <iostream>
#include <memory>

int main() {
    std::unique_ptr<int> p1(new int(5)); // Khởi tạo với con trỏ tới một số nguyên mới
    std::unique_ptr<int> p2 = std::make_unique<int>(10); // phương pháp quy chiếu (C++14 trở đi)

    std::cout << *p1 << ", " << *p2 << std::endl;
    return 0;
}

Chuyển nhượng quyền sở hữu

#include <iostream>
#include <memory>

int main() {
    std::unique_ptr<int> p1(new int(5));

    std::unique_ptr<int> p2 = std::move(p1); // Quyền sở hữu được chuyển từ p1 sang p2

    if (p1) {
        std::cout << "p1 owns the object" << std::endl;
    } else if (p2) {
        std::cout << "p2 owns the object" << std::endl;
    }

    return 0;
}

Sử dụng unique_ptr với Trình xóa tùy chỉnh

#include <iostream>
#include <memory>

struct MyDeleter {
    void operator()(int* ptr) {
        std::cout << "Custom Deleter: Deleting pointer" << std::endl;
        delete ptr;
    }
};

int main() {
    std::unique_ptr<int, MyDeleter> p1(new int(5), MyDeleter());
    return 0; // Trình xóa tùy chỉnh sẽ được gọi khi p1 vượt quá phạm vi
}

Hãy nhớ rằng vì unique_ptr có quyền sở hữu độc quyền nên bạn không thể sử dụng nó khi bạn cần chia sẻ quyền truy cập vào một đối tượng. Đối với những trường hợp như vậy, bạn có thể sử dụng std::shared_ptr.