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 ...
随机推荐
- Idea 注册方式,亲测可用
参考:https://www.cnblogs.com/aacoutlook/p/9036299.html 2018年3月 <License server>方式不能使用了,只好尝试<A ...
- 2019版Idea如何激活
1.下载jar包 链接: https://pan.baidu.com/s/1w4B4_hmiiueNDJMjYKaFyQ 提取码: fkpx 2.修改·vmoptions 1.Help" - ...
- python命名空间(namespace)
命名空间: 每一个作用域变量存储的位置,或者解释为 存储作用域中变量的字典. 作用: 获取想查看某个作用域中的变量名.变量值. 使用方法: locals() #当前命名空间 1. 效果图: 2. 代 ...
- 重拾c++第一天(2):基本语法
1.输出方法: cout<<"输出语句" 2.输出时换行为 cout<<endl or "\n" 3.连续赋值是合法的,从右往左依次赋值 ...
- python中常⽤的excel模块库
python中常用的excel模块库&安装方法 openpyxl openpyxl是⼀个Python库,用于读取/写⼊Excel 2010 xlsx / xlsm / xltx / xltm⽂ ...
- 大厂面试中三次握手延伸出来n连发你受得了?
目录 一.这是一次有故事的对话 二.三次握手的客户端服务端状态 1 先画个图看看有哪些状态 2 tcp协议内容解析 3 通过工具wireshark来验证我们所述 三.说下Linux网络编程常用API ...
- Spring(二)核心容器 - 简介 、BeanFactory、ApplicationContext
目录 前言 1.容器简介 2.容器的结构 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ConfigurableApplicationContext 2.2 ...
- 鉴于崔庆才大大的对于 beautifulsoup 的再理解
源地址看 soups = BeautifulSoup(html) soup = BeautifulSoup(open('index.html')) print soup.prettify() Tag通 ...
- Django2.0 配置 media
1.setting.py文件 MEDIA_URL='/media/' MEDIA_ROOT=os.path.join(BASE_DIR,"media") 注意:MEDIA_ROOT ...
- 遗传编程GP-地图路径寻路
本文介绍的是基于GP,并非A*算法,算是另类实现吧. 先看看地图定义,在文本文件中定义如下字符串,代表30列11行大小的地图 初始位置在左上角(0,0) ,值为1的是允许走的通的路,目标位置为右下角( ...