巧用std::shared_ptr

单例的使用相对比较广泛,但是需要在程序退出前调用它的析构函数对数据进行释放,常规做法是在main函数末尾进行释放工作,

但是这样相对比较繁琐,因此便有了利用全局变量由系统负载析构的特点,定义一个全局str::shared_ptr对象,对象指定对单例进行析构。

因此不需要我们关心何时析构单例,堪称方便。

  SingleObject.hpp

#ifndef SINGLEOBJECT_H
#define SINGLEOBJECT_H class SingleObject
{
public:
static SingleObject& GetInstance();
static SingleObject* GetInstancePtr();
static void DoSomeThing();
static void DelObj();
private:
static void NewObj();
SingleObject();
~SingleObject(); static SingleObject* msObj;
}; #endif // SINGLEOBJECT_H

  SingleObject.cpp

#include "SingleObject.hpp"
#include <iostream>
#include <memory> std::shared_ptr<SingleObject> SingleObjectDeletor( SingleObject::GetInstancePtr(), [](SingleObject *){ SingleObject::GetInstance().DelObj(); }); SingleObject* SingleObject::msObj = NULL; SingleObject::SingleObject()
{
std::cout << "This is the constructor of SignleObject class!\n";
} SingleObject::~SingleObject()
{
std::cout << "This is the destructor of SingleObject class!\n";
} void SingleObject::NewObj()
{
if( NULL == msObj )
{
// lock
msObj = new SingleObject(); // unlock
} std::cout << "New an object, address: " << +msObj << std::endl;
} void SingleObject::DelObj()
{
if( NULL != msObj )
{
delete msObj;
std::cout << "Delete an object!\n";
}
} SingleObject* SingleObject::GetInstancePtr()
{
if( NULL == msObj )
{
NewObj();
} return msObj;
} SingleObject& SingleObject::GetInstance()
{
if( NULL == msObj )
{
NewObj();
} return *msObj;
} void SingleObject::DoSomeThing()
{
std::cout << "SingleObject do some thing!\n";
}

  main.cpp

#include <iostream>
#include "SingleObject.hpp" int main(int argc, char **argv)
{
SingleObject::GetInstance().DoSomeThing(); return 0;
}

  输出:

巧用std::shared_ptr全局对象释放单例内存的更多相关文章

  1. [转]单例模式——C++实现自动释放单例类的实例

    [转]单例模式——C++实现自动释放单例类的实例 http://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html http://blog.s ...

  2. Spring对象类型——单例和多例

    由于看淘淘商城的项目,涉及到了项目中处理spring中bean对象的两种类型,分别是单例和多例,就在此记录一下,方便加深理解,写出更加健壮的代码. 一.单例和多例的概述 在Spring中,bean可以 ...

  3. Scala 孤立对象和单例对象方法体的用法和例子

    [学习笔记] 1  以object关键字修饰一个类名,这种语法叫做孤立对象,这个对象是单例的. 相当于将单例类和单例对象同时定义.相当于java中的单例,即在内存中只会存在一个Test3实例.创建一个 ...

  4. 单例类singleton自动释放

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. (译+原)std::shared_ptr及std::unique_ptr使用数组

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...

  6. 全局对象Application的使用,以及如何在任何地方得到Application全局对象

    Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个application对象,用来存储系统的一些信息.通常我们是不 ...

  7. Unity3D中可中途释放的单例

    Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...

  8. apply 伴生对象 单例对象

    apply(): 当类或者对象有一个主要用途时,apply方法提供了很好语法机制 scala> class Foo {} defined class Foo scala> object F ...

  9. Scala单例对象、伴生对象实战详解

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

随机推荐

  1. java代理通俗简单解析

    1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...

  2. PHP json_decode为什么将json字符串转成数组是对象格式?

    eg. $a='[{\"img\":\"/uploads/agency/carimgs/5/15515954778091.jpg\"},{\"img\ ...

  3. numpy+plot初试

    #coding:utf-8 """ 灵活设置筛子个数,比如3个筛子 """ import numpy as np import matplo ...

  4. centos6.0和7.4默认网卡配置

    6.0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" NM_CONTROLLED="yes&qu ...

  5. python数据结构与算法之问题求解

    懂得计算机的童鞋应该都知道,一条计算机程序由数据结构跟算法两大部分组成.所以,其实不管你使用哪种计算机语言编写程序,最终这两部分才是一个程序设计的核心.所以,一个不懂得数据结构与算法的程序员不是一个好 ...

  6. Cognos集成至portal平台运行报表时只出“#”

    1. 问题描述 报表集成到平台后,运行报表过程中,当多次运行后,页面只显示“#” 2. 问题分析 这是因为浏览器筛选器限制问题 3. 解决方案 在IE浏览器设置中,Internet选项-安全-自定义级 ...

  7. learning makefile 模式规则

  8. 初识HT for web

    目前国内经济转型在潜移默化中已经发生了巨大的变化,保险,零售业,汽车等我能想到的. 只要互联网能插足的行业,都难逃一‘劫’. 刚看了一篇博客--基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化 ...

  9. Linux c codeblock的使用(三):使用函数库

    (一)概念 什么是函数库呢?一下子说概念大家可能不太熟悉,但是这实际上是大家在windows系统上经常见到的东西.没错,就是那些后缀为DLL的文件. linux上实际也有自己的函数库文件,文件类型为. ...

  10. lamba匿名函数与内置函数/递归

    max 循环出的参数给func,func的返回值给key,然后比较那个返回值max(salary,key=func) 匿名函数:max(salary,key=lamba x:salaries[x]) ...