智能指针的作用:智能指针是管理动态分配内存的工具,能够自动释放不再使用的内存,防止内存泄露。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循环引用的问题。