C++智能指针

C++智能指针

std::unique_ptr

C++11提供了三种智能指针, 分别为: shared_ptr, weak_ptr 与 unique_ptr, 以方便内存管理,避免仅使用裸指针可能产生的隐患;
在开发实践中, 为明确内存资源所有权, 我们推荐多使用 unique_ptr , 其他两个智能指针尽量少用, 可将 std::unique_ptr 与裸指针搭配使用, 其中 std::unique_ptr 负责内存的管理, 而裸指针仅负责内存的使用, 这样所有权明确, 减少了问题发生的可能性;
同时, std::unique_ptr 体现了C++RAII的思想精髓,实现了资源的自动管理, 其思想值得在开发实践中学习借鉴;

示例代码

关于 C++11/14 中智能指针使用对于代码的改善如下所示:

// C++98/03 风格
class Demo {
public:
    Demo() {
        m_mem = new Mem();
    }
    ~Demo() {
        // 很有可能忘记此步骤
        if (m_mem) {
            delete m_mem;
        }
    }
    // ...
private:
    Mem* m_mem;
    // ...
};


int main()
{
    Demo* demo1 = new Demo();
    Demo* demo2 = new Demo();
    std::vector<Demo*> vec;
    vec.push_back(demo1);
    vec.push_back(demo2);
    
    // ...
    // 很有可能忘记此步骤
    for (Demo* ptrDemo : vec) {
        delete ptrDemo;
    }
    
    return 0;
}
// C++11/14 风格
class Demo {
public:
    Demo() {
        m_mem = std::make_unique<Mem>();
    }
    ~Demo() {
        // 内存由 unique_ptr 自动管理, 无需开发者手动释放
        // do other things
    }
    // ...
private:
    std::unique_ptr<Mem> m_mem;
    // ...
};


int main()
{
    std::unique_ptr<Demo> demo1 = std::make_unique<Demo>();
    std::unique_ptr<Demo> demo2 = std::make_unique<Demo>();
    std::vector<std::unique_ptr<Demo>> vec;
    vec.push_back(std::move(demo1));
    vec.push_back(std::move(demo2);

    assert(demo1 == nullptr);
    assert(demo2 == nullptr);
    
    // ...
    
    return 0;
}

本文作者: 王同学