关闭

智能指针auto_ptr、内存泄漏解决

标签: 智能指针内存泄露
563人阅读 评论(0) 收藏 举报
分类:

在C++11中,已经不使用auto_ptr,而用 unique_ptr进行替代,不过二者原理都差不多。头文件:memory

智能指针:实质上是一个类,在创建智能指针的时候,本质上是在栈上创建了一个对象,而析构函数总是会在出栈时被调用,清理会自动进行。unique_ptr(auto_ptr)通过在栈上构建一个对象a,对象a中动态分配内存指针p,所有对指针p的操作都转为对对象a的操作。而在a的析构函数中会自动释放p的空间,而该析构函数是编译器自动调用的,无需程序员操心。
unique_ptr(auto_ptr):都是唯一指针,且只能智能指针都要直接初始化,但unique_ptr(auto_ptr)不能像shared_ptr那样共享,对于指针不能复制,只能转移其控制权,利用release()和reset()函数,转移之后,原来的指针就失效了。

内存泄漏定义
1、new了一个空间,但没有delete;
2、动态内存不存在作用域的问题,但保存其地址的指针变量是受作用域影响的,指针一般是局部变量,在函数内部new以后没有释放,
那么该区域的内存将始终不能为其他数据所使用,而指向该内存的指针是个局部变量,当定义该指针的函数结束并且返回时,指针也就消失了,我们就再也找不到该块中的内存区域,指向该内存区域的指针自动消失了。 计算机就再也找不到该区域的内存了,就好像是丢失了这块内存一样,这种情况被称之为内存泄漏。

优点:
解决内存泄漏问题,智能指针在出栈时,都会自动释放指针,而不用像使用普通指针那样要考虑因为异常等原因没有delete掉。

使用注意:
1、应绝对避免把auto_ptr放到容器中,(unique_ptr)auto_ptr拷贝赋值时是所有权转移,而在容器中可能会产生临时对象拷贝赋值,临时对象获得所有权之后就析构了释放了对象。并且很难避免STL内部对容器中的元素实现赋值,这样便会使容器中多个元素被置位NULL。

vector<auto_ptr<MyClass>>m_example//绝不能这样做

2、auto_ptr的析构函数调用的是delete不是delete [],所以不能使用智能指针数组。

3、避免unique_ptr(auto_ptr)之间的赋值。

4、当将unique_ptr(auto_ptr)作为函数参数时,最好声明为const auto_ptr&引用,避免所有权转移,当函数返回值可以简单的传值。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33478次
    • 积分:1234
    • 等级:
    • 排名:千里之外
    • 原创:87篇
    • 转载:29篇
    • 译文:0篇
    • 评论:1条
    最新评论