正确地使用智能指针
Posted 八叶一刀·无仞剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正确地使用智能指针相关的知识,希望对你有一定的参考价值。
C++没有像Java和C#那样存在自动内存回收机制,因此C++的内存管理是每一个C++程序员都要面对的问题。所幸的是,C++提供了智能指针这一机制来帮助我们自动地管理内存分配,大大方便了内存管理。
C++提供了两种智能指针:auto_ptr和shared_ptr,这两种类型都具备自动管理内存资源的功能。当智能指针离开作用域的时候,其指向的内存区块会被自动销毁,防止内存泄漏问题。
对于auto_ptr,注意一定不要让多个auto_ptr同时指向同一对象!它有一个不寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!
#include <iostream> #include <memory> int main() { int* x=new int; std::auto_ptr<int> sp(x);//now sp points to x std::auto_ptr<int> sp2=sp;//now sp2 points to x,sp is null return 0; }
这种赋值方式明显是很不自然的,因此我们可以通过shared_ptr来管理指针。多个shared_ptr对象可以指向同一个指针,当最后一个指向该指针的shared_ptr对象不再指向它之后,该区域内存就会被自动销毁。
#include <iostream> #include <memory> int main() { int* x=new int; std::tr1::shared_ptr<int> sp(x);//now sp points to x std::tr1::shared_ptr<int> sp2=sp;//now sp2 points to x,sp as well return 0; }
需要注意的是,无论是auto_str还是shared_str,其销毁内存的函数都是delete而不是delete[]。也就是说,如下用法会导致内存泄露:
std::tr1::shared_ptr<int> sp(new int[5]);
但这样是可以通过编译的,因此这是使用智能指针需要注意的一点。
以上是关于正确地使用智能指针的主要内容,如果未能解决你的问题,请参考以下文章