首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
shared_ptr释放
2024-11-06
巧用std::shared_ptr全局对象释放单例内存
巧用std::shared_ptr 单例的使用相对比较广泛,但是需要在程序退出前调用它的析构函数对数据进行释放,常规做法是在main函数末尾进行释放工作, 但是这样相对比较繁琐,因此便有了利用全局变量由系统负载析构的特点,定义一个全局str::shared_ptr对象,对象指定对单例进行析构. 因此不需要我们关心何时析构单例,堪称方便. SingleObject.hpp #ifndef SINGLEOBJECT_H #define SINGLEOBJECT_H class SingleObjec
C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)
这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr). shared_ptr shared_ptr 基本用法 shared_ptr采用引用计数的方式管理所指向的对象.当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1.当shared_ptr离开作用域时,引用计数减1.当引用计数为0时,释放所管理的内存. 这样做的好处在于解放了程序员手动释放内存的压力.之前,为了处理程
2016-11-02: boost::enable_shared_from_this
使用场景 当类对象被shared_ptr管理时,需要在类自己定义的函数中把当前对象作为参数传递给其他函数时,必须传递一个shared_ptr,否则就不能保持shared_ptr管理这个类对象的语义.因为有一个raw pointer指向这个类对象,而shared_ptr对类对象的这个引用没有计数,很可能shared_ptr已经把类对象资源释放了,而那个调用函数还在使用类对象--显然,这肯定会产生错误. 使用方法 在上述场景中,我们需要在类内部获得自己的shared_ptr.我们可以让自己定义的类继
C++ 标准库智能指针
整理一下c++中shared_ptr,weak_ptr,unique_ptr三种指针的使用案例和注意事项,让程序资源更加案例,在标准库中,需要包含<memory>,在boost库中, 一. 智能指针unique_ptr 与shared_ptr相似,区别在于unique_ptr是独立拥有对象权,因此只有move语言,无拷贝语义,不做其它详述了. 二.智能指针share_ptr 1.基本使用 class Sam { public: Sam(int v):val(v) { } int32_t val
c++ 封装线程库 3
1. 继承与重写run方法 我们封装了Thread类,并设置成员函数run()为纯虚函数,因此我们使用类继承,并重写run方法: class IncCount : public Thread//增加计数线程 { private: int id_; public: IncCount(int id):id_(id){} void run() { ;i < ;i ++) { { MutexLockGuard lock(mutex); count++; ) { cond.notify();//通知 }
smart pointer
smart pointer是一种abstract data type,它可以模仿指针的行为,而且额外提供了一系列诸如自己主动内存管理.边界检查等特性,这些特性是为了在保证效率的基础上降低因为对指针的不正常使用而带来的bug. smart pointer可以自己主动进行object的销毁:当某个object的最后一个拥有者被destroy的时候(如局部变量离开了作用域).由smart pointer管理的object会被自己主动销毁.smart pointer是被声明在stack中的 在C++中.
「C++ 」借来的资源,何如还的潇洒?
前言 本文的内容将专门对付内存管理,培养起有借有还的好习惯,方可消除资源管理的问题. 正文 所谓的资源就是,一旦用了它,将来必须还给系统.如果不是这样,糟糕的事情就会发生. C++ 程序内常见的资源: 动态分配内存 文件描述符 互斥锁 图形页面中的字型和笔刷 数据库连接 网络 sockets 无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统,有借有还是个好习惯. 细节 01 : 以对象管理资源 把资源放在析构函数,交给析构函数释放资源 假设某个 class 含有个工厂函数,该函数获取
晓说智能指针shared_ptr为何可以实现跨模块分配和释放内存
最近做项目, 有个地方是外包人员写的, 其中有个函数,大致这样 void getInfo(std::shared_ptr<Info>& outInfo); 这个函数是一个dll(链接静态vc库, 使用/MT链接选项). 我在exe(也是/MT选项)中使用这个函数, 一开始看了,感觉危险,为啥呢?因为我是这样调用的 f() { std::shared_ptr<Info> tmpInfo; getInfo(tmpInfo); } 所以,内存是在dll里面分配的,但是 内存在f退
C++ 0x 使用 shared_ptr 自动释放, 防止内存泄漏
最近在研究 cocos2d-x 3.0 ,它在创建类的对象时比如 Layer 时, 并不是直接使用 new , 而是使用一个宏方法 CREATE_FUNC(MyLayer);. 这个宏就是自动的创建了一个 静态的 create 方法. 你可以使用 MyLayer::create(); 之所以这样做, 主要是使用了cocos2d-x 的引用计数式的垃圾回收机制. 这个机制是 Object-C 的 autorelease. 这样的方式很方便程序员, 不用再去自己去清理内存,不会造成内存泄漏. 而
C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为了省时间一般都是任由这个内存泄漏发生. 当然也可以经过复杂的设计,由一个监控线程来统一删除, 但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的. shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放. 我们来测试看看效果
智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来). C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件<memory>. shared_ptr使用引用计数,每一个shar
shared_ptr
省去对象指针的显示delete typedef tr1::shared_ptr<int> IntPtr; IntPtr fun() { IntPtr p = new int(3); return p; } int main() { 1 IntPtr t = fun(); cout<<endl; 2 fun(); cout<< endl; } objdump后观察汇编代码,得出如下结论 1:执行完后直接下一行语句,再进行sharedptr的释放动作: 2:f
如何用shared_ptr减少锁的争用
在并发环境下锁的使用是家常便饭, 如何减少锁的使用是优化程序性能的一个方面. c++11里面新增了智能指针std::shared_ptr, 这个东西也许能给我们带来些启发. shared_ptr的一个特性是当引用计数为0时,它所拥有的堆内存会被自动释放. 利用这个特性我们可以做点实用的功能, 如下程序: #include <assert.h> #include <chrono> #include <iostream> #include <mutex> #in
C++ 之 auto_ptr and shared_ptr
1.auto_ptr 这个所谓的只能指针有点鸡肋! 没有引用计数,而且还有一个所有权转移的情况! 当所有权转移后,以前的auto_ptr将会成为null 2.shared_ptr 增加了引用计数,没有所有权转移问题 但是它俩在析构的时候都没有delete[]动作,所以不能释放数组类型! 当然,可以重写一个可以释放数组的模板类!
shared_ptr和多线程
前一篇文章写得实在太挫,重新来一篇. 多线程环境下生命周期的管理 多线程环境下,跨线程对象的生命周期管理会有什么挑战?我们拿生产者消费者模型来讨论这个问题. 实现一个简单的用于生产者消费者模型的队列 生产者消费者模型的基本结构如下图所示: 如果我们要实现这个队列该怎么写?首先我们先简单挖掘下这个队列的一些基本需求. 显而易见,这个队列需要支持多线程并发读写. 我们知道,多线程并发读写同一个对象,需要对读写操作进行同步以避免data race[1].在C++11里,我们可以借助mutex. 另外当
shared_ptr:资源管理利器
如果你还在使用传统的C++,那么可以肯定堆内存的管理让你头痛过!在传统的C++领域,堆内存管理上我们能借用的现成工具就只有auto_ptr.但是很不幸用auto_ptr管理堆内存简直就是个错误.auto_ptr的问题可以归结为两点: 不能配合STL容器一起使用.将auto_ptr置于容器中,就是个编译错误(如果是一个编译错误,你得感谢,还好编译期就发现了) 不能管理动态数组.auto_ptr只能管理单个对象指针,如果指针是通过new T[num]的方式生成的,那不好意思了,这个就是个埋得比较深的
shared_ptr 和 unique_ptr
c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你确信需要 shared_ptr,否则请将该指针用作 POCO 的默认选项. 可以移到新所有者,但不会复制或共享. 替换已弃用的auto_ptr. 与 boost::scoped_ptr 比较. unique_ptr 小巧高效:大小等同于一个指针且支持 rvalue 引用,从而可实现快速插入和对 ST
c++ shared_ptr 使用注意事项. 1
条款1:不要把一个原生指针给多个shared_ptr管理 int* ptr = new int; shared_ptr<int> p1(ptr); shared_ptr<int> p2(ptr); //logic error ptr对象被删除了2次 这种问题比喻成“二龙治水”,在原生指针中也同样可能发生. 条款2:不要把this指针给shared_ptr class Test{ public: void Do(){ m_member_sp = shared_ptr<Tes
[5] 智能指针boost::shared_ptr
[1]boost::shared_ptr简介 boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include<boost/shared_ptr.hpp>便可以使用. 上篇<智能指针boost::scoped_ptr>中我们看到boost::scoped_ptr独享所有权,不允许赋值.拷贝. 而boost::shared_ptr是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数机制.同时也就意味着支持赋值和拷贝.
标准库shared_ptr智能指针的实现
目前测试功能正常.若有不完善的地方在改进吧.时候不早了睡觉去,哎,翘课会被抓,不冒险了.晚安全世界O(∩_∩)O /************************************************************************* *my shared_ptr: share_ptr *author:ERIC *blog:http://www.ilovecpp.com *time:2015-5-28 01:36:43 ************************
热门专题
数据库连接报1045错误
thymeleaf img 绝对路径
git 还原所有文件上一次提交的状态
uploadfive 后端
P4Merge windows 下载
vscode设置插件不能自动更新
qt使用qcustomplot
termux 怎安装COC插件
mysql8.0导入sql文件windows
宝塔node Invalid Host header
chown 取消所有者
C#与三菱PLC串口通讯FX系列 DLL
vector当数组用
QT 如何不继承父窗口的sheetstyle
图像配准 求变化矩阵
怎么隐藏thinkphp错误页面
nvm-setup.zip下载
求四个数中偏差最大的值
navicat for MySQL破解下载linux
杭州车牌号库没有62数字