- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C++智能指针使用总结听语音|浏览:1385|更新:2015-04-24 20:27C++提供了4种智能指针用于对分配的内存进行自动释放,这些智能指针如下:????? auto_ptr、unique_ptr、shared_ptr、weak_ptr。其中auto_ptr在C++98标准引入,后三种在C++11标准中加入。而auto_ptr已经被C++11所摒弃,建议使用后三种智能指针,这4种智能指针使用模板(template)实现。在此总结下个人对这4种智能指针肤浅认识。工具/原料GNU GCC g++ 4.8.1 C++编译器C++智能指针简介1?????? C++智能指针是行为类似于指针的类对象。它使用设计模式中的代理模式,代理了原始“裸”指针的行为,为指针添加了更多更有用的特性。?????? C++引入异常机制后,智能指针由一种技巧升级为一种非常重要的技术,因为如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码释放资源,而智能指针则可以在退出作用域时——不管是正常离开或是因异常离开——总调用delete来析构在堆栈上动态分配的对象。?????? 因为C++异常处理的真正功能在于它具有为异常抛掷前构造的所有局部对象(那么智能指针对象也适用)自动调用析构函数的能力(C++异常机制不仅仅在于它能够处理各种不同类型的异常)。所以在异常退出智能指针对象作用域时,总能由C++异常机制调用析构函数释放在堆栈上动态分配的对象。?????? 当然,正常退出对象(智能指针对象也属于此列)作用域也会自动调用析构函数释放在堆栈上动态分配的对象。?????? 由此可知,将“裸”指针包装成智能指针对象可以实现动态分配的内存对象的自动释放。?????? 而且C++智能指针对象可以像原指针那样直接使用运算符,如赋值运算符=,指针运算符-,解引用运算符*。这点可以从下面的”shared_ptr智能指针--shared_ptr模板类摘要“部分可以印证。ENDauto_ptr智能指针(C++98)1所属头文件:#include memory所属命名空间及标识符:using std::shared_ptr;所属版本:C++98g++启用版本命令:g++?-std=c++98?-c -o补充:?????? 如果启用c++11及以上标准,即g++ -std=c++11 -c -o,编译时会有一个警告信息提示warning:‘auto_ptr’ is deprecated? (‘auto_ptr‘被反对使用)2?????? 存在很多种智能指针,其中最有名的应该是C++98标准中的“自动指针”std::auto_ptr,它部分解决了获取资源自动释放的问题,例如:#include memory#include iostream#include stringusing std::cin;using std::cout;using std::string;using std::auto_ptr;class Report{private:??? std::string str;public:??? Report( const string s ):str(s) { cout Object created!\n; }??? ~Report() { cout Object deleted!\n; }??? void comment(string owner) const { cout owner str \n; }};int main(void){?? ???? auto_ptrReport ps (new Report(Using auto_ptr.));?? ???? ps-comment(string(ps:));?? ???? auto_ptrReport p1;?? ???? p1 = ps;? //赋值完毕后ps已经失去对内存对象的所有权,不可再使用?? ???? p1-comment(string(p1:));?? ???? //ps-comment(string(after p1=ps:));? //error,Segmentation faul}/*Result:Object created!Using auto_ptr.Object deleted!*/???? auto_ptr的构造函数接受new操作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但因为重载了 operator*后operator-,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时(离开作用域或异 常),C++会保证auto_ptr对象销毁,调用auto_ptr的析构函数,进而使用delet
文档评论(0)