C++——智能指针
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++——智能指针,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2446字,纯文字阅读大概需要4分钟。
内容图文
![C++——智能指针](/upload/InfoBanner/zyjiaocheng/716/bb24e4ec600a4e01b9bcc1f200980fd5.jpg)
动态内存管理:new-delete——很难正确释放内存——智能指针
使用场景:
1.程序不知道自己要使用多少对象
2.程序不知道自己所需对象的准确类型
3.程序需要在多个对象之间共享数据
4.坚持只使用智能指针,可以避免指针的内存管理可能带来的问题:
- 忘记delete内存——内存泄漏
- 使用已经释放掉的空间
- 同一块内存释放两次
- 查找指向相同内存的指针非常困难
void f() { shared_ptr<int> sp(new int(42)); //之后的代码出现异常,在f中没有被捕获 }//函数结束时,shared_ptr会自动释放内存 void f() { int *ip=new int(42); //之后的代码出现异常,在f中没有被捕获 delete ip; }//如果在new和delete之间发生异常,且没有捕获,内存就永远不会被释放了
5.不要混合使用普通指针和智能指针
void process(shared_ptr<int> ptr)//函数被调用时,创建ptr并初始化;值传递,有一次拷贝 { // }//ptr离开作用域,被销毁 shared_ptr<int> p(new int(42));//引用计数1 process(p);//拷贝p会增加引用计数;在process中引用计数为2 int i=*p;//正确,引用计数为1 int *x(new int(1024));//X是普通指针,不是智能指针 precess(x);//错误 process(shared_ptr<int>(x));//合法,但是内存会因为退出函数时,被释放而释放 int j=*x;//错误,x已经被释放
类别
1.shared-ptr:多指针指向同一对象
make_share<T> ( )
2.unique-ptr:独占对象
shared_ptr重要知识点
1.shared_ptr必须显示直接初始化
shared_ptr<double> p1; shared_ptr<int> p1=new int(1024);//错误,尝试用int*隐式初始化 shared_ptr<int> p2(new int(42));//正确,直接初始化 shared_ptr<int> clone(int P){ //return new int(P);//错误 return shared_ptr<int>(new int(p));//正确,显示绑定 }
2.不要用get初始化另一个智能指针或赋值
get:向不能使用智能指针的代码传递内置指针。智能在确认代码不会被delete情况下才能使用
shared_ptr<int> p(new int(42)); int *q=p.get(); { shared_ptr<int> (q); }//q被销毁,指向的内存被释放 int foo =*p;//未定义,p指向的内存已经被释放
3.不使用相同的内置指针初始化或reset多个智能指针
4.不delete掉 get()返回的指针。记住原智能指针销毁后,get()的指针就无效了
5.如果使用智能指针管理的资源不是new分配的内存,记得传递给他一个删除器。//?
unique_ptr<objT,delT> p(new objT,fcn);
unique_ptr重要知识点
1.不能拷贝或赋值它本身,但可以release或reset它指向的内容
unique_ptr<string> p1(new string("word")); unique_ptr<string> p2(p1);//错误 unique_ptr<string> p3; p3=p2;//错误 unique_ptr<string> p2(p1.release());//p2被初始化为p1原来保存的指针,p1置空 unique_ptr<string> p3(new string("text")); p2.reset(p3.release());//释放了p2的“word”内存, p3的所有权转给了p2 ,p3置空 p2.release();//错误,p2不会释放内存, 且丢失了指针 auto p=p2.release();//正确,但记得delete(p)
weak_ptr
1.w=p;不会改变p的引用计数,当最后一个p的对象被释放,w被释放
内容总结
以上是互联网集市为您收集整理的C++——智能指针全部内容,希望文章能够帮你解决C++——智能指针所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。