当前位置:首页 C++ > 正文

c++智能指针什么时候释放

作者:野牛程序员:2023-08-04 04:37:51 C++阅读 2672

C++智能指针是通过RAII(资源获取即初始化)的原则来管理资源的释放。智能指针会在以下情况下自动释放资源:

  1. 离开作用域:当智能指针所在的作用域结束时,智能指针会自动释放资源。这适用于std::unique_ptr    

  2. void someFunction() {
        {
            std::unique_ptr<int> ptr(new int(10));
            // 在此处使用ptr管理的资源
        } // 在这个花括号结束时,ptr超出作用域,资源自动释放
    }
  3. 所有权转移:对于std::unique_ptr,当其被赋值给其他std::unique_ptr或被移动构造到其他std::unique_ptr时,所有权会转移,原先的std::unique_ptr不再管理资源,资源会被转移到新的std::unique_ptr中。

    std::unique_ptr<int> ptr1(new int(20));
    std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr2获得资源的所有权,ptr1不再管理资源

  4. 共享引用计数为0:对于std::shared_ptr,当所有共享指针不再引用资源时,即引用计数变为0时,资源会被释放。

    std::shared_ptr<int> ptr1 = std::make_shared<int>(30);
    std::shared_ptr<int> ptr2 = ptr1; // ptr1和ptr2共享资源
    ptr1.reset(); // 释放ptr1对资源的引用,引用计数为1
    ptr2.reset(); // 释放ptr2对资源的引用,引用计数为0,资源自动释放

请注意,智能指针在这些情况下会自动释放资源,从而避免了手动调用deletedelete[]的操作,从而降低了内存泄漏的风险。但需要注意避免循环引用(circular reference)情况,因为循环引用可能导致资源无法正确释放。在处理循环引用的情况时,可以考虑使用std::weak_ptr来打破循环引用,避免资源泄漏。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击