c++中的智能指针怎样释放连续的资源?
以前学智能指针时有点想当然了,一直以为智能指针很智能,不管你让它管理的是单个资源还是连续的资源它都能正确的将资源释放,现在发现自己大错特错。
先看代码:
#include <iostream>
#include <memory>
using namespace std;
class Test
{
public:
Test() { cout << "Test is construct" << endl; }
~Test() { cout << "Test is destruct" << endl; }
};
case1:管理单个资源
int main()
{
shared_ptr<Test> pTest(new Test);
return ;
}
这种情况是没有问题的,程序结束时自动释放资源,控制台输出"Test is construct" 和 "Test is destruct"。
case2:管理连续资源
首先,我们知道c++里释放单个资源和连续资源的语法是不一样的,前者用delete,后者用delete[ ]
如:
int main()
{
Test* pSingle = new Test;
delete pSingle;
Test* pSerial = new Test[];
delete[] pSingle;
}
那么如何用智能指针管理呢?
错误的示范:
int main()
{
shared_ptr<Test> pTest(new Test[]);
return ;
}
输出结果如下:
nice,成功滴让系统报了错。那么问题出在哪儿?
其实上述的代码和下面这段代码的效果相同:
int main()
{
Test* pSerial = new Test[];
delete pSerial;
return ;
}
系统需要的是delete[ ],而你给他的确实delete,系统当然不乐意咯。
正确的姿势:
上面的例子可以看出,share_ptr的析构函数的默认功能是对你传进去的资源进行delete操作。
但我们此时的需要是对该指针进行delete[ ]操作,怎么实现?
实现share_ptr的大佬们很体贴的为我们提供了这样的一种方式:我们在构造share_ptr对象的时候,可能额外滴传进去一个参数。
template< class Y, class Deleter > shared_ptr( Y* ptr, Deleter d );
shara_ptr析构的时候,将用我们传进去的Deleter对资源进行析构操作。
Deleter的形式可以有多种,如重载过()的类、函数、lambda等等。
void destructTest(Test* pt)
{
cout << "call this destruct" << endl;
delete[] pt;
} class DestructTest
{
public:
void operator()(Test* pt)
{
cout << "call this destruct" << endl;
delete[] pt;
}
}; int main()
{
//shared_ptr<Test> pTest(new Test[5], DestructTest());
//shared_ptr<Test> pTest(new Test[5], destructTest);
shared_ptr<Test> pTest(new Test[], [](Test* pt)
{
cout << "call this destruct" << endl;
delete[] pt;
});
return ;
}
c++中的智能指针怎样释放连续的资源?的更多相关文章
- OSG中的智能指针
在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...
- Boost中的智能指针(转)
这篇文章主要介绍 boost中的智能指针的使用.(转自:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html) 内存管理是一 ...
- C++中的智能指针、轻量级指针、强弱指针学习笔记
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...
- ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)
一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...
- 标准库中的智能指针shared_ptr
智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...
- 智能指针类模板(中)——Qt中的智能指针
Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...
- 智能指针类模板(上)——STL中的智能指针
智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...
- C++中的智能指针类模板
1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...
- C++ 中的智能指针-基础
简介 在现代 C++ 编程中,标准库包含了智能指针(Smart pointers). 智能指针用来确保程序不会出现内存和资源的泄漏,并且是"异常安全"(exception-safe ...
随机推荐
- Redis内存碎片清理
当Redis中清理了大量的Key之后原先Redis申请的内存(used_memory_rss)将继续持有而不会释放,此时查看内存信息将会看到存在大量的内存碎片.那么,Redis的内存碎片可以清理么,该 ...
- 【JavaScript学习笔记】数据类型
1.获取数据类型 typeof 用法: typeof variable or typeof(variable) JavaScript中总共有6种数据类型,string.number.boolean ...
- js实现类选择器和name属性选择器
jQuery的出现,大大的提升了我们操作dom的效率,使得我们的开发更上一层楼,如jQuery的选择器就是一个很强大的功能,它包含了类选择器.id选择器.属性选择器.元素选择器.层级选择器.内容筛选选 ...
- 深入理解vue的watch
深入理解vue的watch vue中的wactch可以监听到data的变化,执行定义的回调,在某些场景是很有用的,本文将深入源码揭开watch额面纱 前言 watch的使用 watch的多种使用方式 ...
- ILSpy反编译工具之C#反汇编
1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.NET Framework 4.0. ...
- 深入理解 Java 并发锁
本文以及示例源码已归档在 javacore 一.并发锁简介 确保线程安全最常见的做法是利用锁机制(Lock.sychronized)来对共享数据做互斥同步,这样在同一个时刻,只有一个线程可以执行某个方 ...
- FastOne专业计算平台助力生命科学研发
11月16日,由AWS主办的云计算行业沙龙在中油阳光酒店举行,速石科技CEO陈熹就高性能计算如何助力生命科学领域发表了精彩的演讲. 面临的问题及挑战 在算力及高性能领域,随着行业客户的业务需求量,数据 ...
- Ubuntu阿里镜像
ubuntu 14.04: http://mirrors.aliyun.com/ubuntu-releases/14.04/ ubuntu 16.04: http://mirrors.aliyun.c ...
- hdu4841
今天天气确实很好! 接下来是圆桌问题,顺便做个vector容器的笔记方便以后复习.嘿嘿 Problem Description圆桌上围坐着2n个人.其中n个人是好人,另外n个人是坏人.如果从第一个人开 ...
- 【java面试】集合类篇
java中主要的类集合接口如下 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├Has ...