以前学智能指针时有点想当然了,一直以为智能指针很智能,不管你让它管理的是单个资源还是连续的资源它都能正确的将资源释放,现在发现自己大错特错。

先看代码:

 #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++中的智能指针怎样释放连续的资源?的更多相关文章

  1. OSG中的智能指针

    在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...

  2. Boost中的智能指针(转)

    这篇文章主要介绍 boost中的智能指针的使用.(转自:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html) 内存管理是一 ...

  3. C++中的智能指针、轻量级指针、强弱指针学习笔记

    一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...

  4. ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

    一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...

  5. 标准库中的智能指针shared_ptr

    智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...

  6. 智能指针类模板(中)——Qt中的智能指针

    Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...

  7. 智能指针类模板(上)——STL中的智能指针

    智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...

  8. C++中的智能指针类模板

    1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...

  9. C++ 中的智能指针-基础

    简介 在现代 C++ 编程中,标准库包含了智能指针(Smart pointers). 智能指针用来确保程序不会出现内存和资源的泄漏,并且是"异常安全"(exception-safe ...

随机推荐

  1. 生成TFRecord文件完整代码实例

    import os import json def get_annotation_dict(input_folder_path, word2number_dict): label_dict = {} ...

  2. Kettle中JavaScript内置函数说明

    本文链接:https://blog.csdn.net/u010192145/article/details/102220563 我们在使用JavaScript组件的时候,在左侧核心树对象栏中可以看到K ...

  3. [思维导图] C标准库

  4. phpstorm配置git并解决Terminal 中文乱码(Unicode 编码)的方法

    前言:在使用PHPstorm的时候,需要用到terminal,主要还是用这个操作git,但是在使用这个的时候会发现,代码里所有中文都是乱码状态,不利于使用,下面就来看看怎么解决这个问题 一.先在php ...

  5. Nginx作为web静态资源服务器——防盗链

    ​ 基于http_refer防盗链配置模块 Syntax:valid_referers none | blocked | server_names | string ...; Default:—— C ...

  6. Elasticsearch系列---结构化搜索

    概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...

  7. IO系统-文件与目录操作

    1.文件内核数据结构 一个打开的文件在内核中使用三种数据结构表示: (1)文件描述符表 文件描述符标志 文件表项指针 (2)文件表项: 文件状态标志:读.写.追加.同步和非阻塞等状态标志 当前文件偏移 ...

  8. NOI2.6 8782: 乘积最大

    描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好 ...

  9. KALI美化-设置CONKY开机启动

    简介 Conky 是一个应用于桌面环境的系统监视软件,可以在桌面上监控系统运行状态.网络状态等一系列参数 https://github.com/brndnmtthws/conky/ 详细配置文档:ht ...

  10. java重点知识点整理

    隔壁班的帅哥给我的 1.1简述JAVA的语言特点 a语法简单,功能强大 b分布式与安全性 c与平台无关 d多线程 1.2什么是Java虚拟机?它包括哪几个部分? 解: Java 虚拟机 (JVM ) ...