Bootstrap

C++智能指针

在C++中,智能指针是管理动态分配内存的工具,它们自动处理内存的分配和释放,帮助避免内存泄漏。C++标准库提供了几种智能指针,包括std::unique_ptrstd::shared_ptrstd::weak_ptr。下面是这些智能指针的基本使用方法:

std::unique_ptr

std::unique_ptr拥有独占所有权的指针,同一时间内只能有一个unique_ptr指向某个资源。当unique_ptr离开作用域时,它所指向的资源会被自动删除。

#include <memory>

int main() {
    std::unique_ptr<int> ptr(new int(42)); // 创建unique_ptr并初始化

    // 使用智能指针
    std::cout << *ptr << std::endl; // 输出42

    // 不需要手动删除,智能指针会自动管理内存
} // 当ptr离开作用域时,它所指向的内存会被自动释放

std::shared_ptr

std::shared_ptr允许多个智能指针共享同一个资源的所有权。资源会在最后一个指向它的shared_ptr销毁时被释放。

#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> ptr1(new int(42)); // 创建shared_ptr并初始化
    std::shared_ptr<int> ptr2(ptr1); // ptr2共享ptr1的资源

    std::cout << *ptr1 << " " << *ptr2 << std::endl; // 输出42 42

    // 当ptr1和ptr2离开作用域时,资源只在最后一个shared_ptr被销毁时释放
} // 如果这里只有ptr1离开了作用域,资源依然不会被释放,直到ptr2也离开作用域

std::weak_ptr

std::weak_ptr是一种不增加它所指向的对象的引用计数的智能指针,通常与shared_ptr一起使用,用来避免循环引用的问题,并检测资源是否已经被释放。

#include <memory>
#include <iostream>
#include <boost/optional.hpp> // 或者C++17中的std::optional

int main() {
    std::shared_ptr<int> shared(new int(42));
    std::weak_ptr<int> weak(shared);

    if(auto locked = weak.lock()) { // lock()尝试获取一个shared_ptr
        std::cout << *locked << std::endl; // 输出42,如果资源存在的话
    } else {
        std::cout << "Resource has been released." << std::endl;
    }

    // weak_ptr不会延长资源的生命周期
} // 资源在shared_ptr离开作用域时被释放,weak_ptr检测到资源已被释放
;