一文解析C++四种智能指针

74 阅读1分钟

智能指针的作用:智能指针是管理动态分配内存的工具,能够自动释放不再使用的内存,防止内存泄露。C++标准库里面提供了四种智能指针。

  • auto_ptr : auto_ptr在c++11中被弃用, 原因是因为auto_ptr拷贝时会转移所有权,这就可能导致原指针失效的问题,引发悬空指针的问题
int main(){
    auto_ptr<string> films[5]={
            auto_ptr<string>(new string("1")),
            auto_ptr<string>(new string("2")),
            auto_ptr<string>(new string("3")),
            auto_ptr<string>(new string("4")),
            auto_ptr<string>(new string("5"))
    };
    //将所有权从films[2]转让给pwin,此时films[2]不再引用该字符串从而变成空串
    auto_ptr<string> pwin=films[2];
    for(int i=0;i<5;i++){
        cout<<*films[i]<<endl;
    }
    return 0;
}
  • unique_ptr: 独占所有权,禁止拷贝,只能移动。确保资源在任何时候只有一个所有者,适合管理独占资源
std::unique_ptr<int> ptr(new int(42));  
// std::unique_ptr<int> ptr2 = ptr; // 错误:不能拷贝  
std::unique_ptr<int> ptr2 = std::move(ptr); // 正确:只能移动  
  • share_ptr: 共享所有权,使用引用技术跟踪所有持有者。每有一个指针指向这块内存,引用计数+1,每次析构时,引用计数-1,在引用计数大于0时。
std::shared_ptr<int> ptr1(new int(42));  
std::shared_ptr<int> ptr2 = ptr1; // 正确:引用计数+1  
// 当ptr1和ptr2都超出作用域时,内存释放  
  • weak_ptr: 弱引用,不会增加引用计数。解决share_ptr循环引用的问题。