shared_ptr注意点】的更多相关文章

多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为了省时间一般都是任由这个内存泄漏发生. 当然也可以经过复杂的设计,由一个监控线程来统一删除, 但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的. shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放. 我们来测试看看效果…
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来). C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件<memory>. shared_ptr使用引用计数,每一个shar…
省去对象指针的显示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…
在并发环境下锁的使用是家常便饭, 如何减少锁的使用是优化程序性能的一个方面. c++11里面新增了智能指针std::shared_ptr, 这个东西也许能给我们带来些启发. shared_ptr的一个特性是当引用计数为0时,它所拥有的堆内存会被自动释放. 利用这个特性我们可以做点实用的功能, 如下程序: #include <assert.h> #include <chrono> #include <iostream> #include <mutex> #in…
1.auto_ptr 这个所谓的只能指针有点鸡肋!  没有引用计数,而且还有一个所有权转移的情况! 当所有权转移后,以前的auto_ptr将会成为null 2.shared_ptr 增加了引用计数,没有所有权转移问题 但是它俩在析构的时候都没有delete[]动作,所以不能释放数组类型! 当然,可以重写一个可以释放数组的模板类!…
前一篇文章写得实在太挫,重新来一篇. 多线程环境下生命周期的管理 多线程环境下,跨线程对象的生命周期管理会有什么挑战?我们拿生产者消费者模型来讨论这个问题. 实现一个简单的用于生产者消费者模型的队列 生产者消费者模型的基本结构如下图所示: 如果我们要实现这个队列该怎么写?首先我们先简单挖掘下这个队列的一些基本需求. 显而易见,这个队列需要支持多线程并发读写. 我们知道,多线程并发读写同一个对象,需要对读写操作进行同步以避免data race[1].在C++11里,我们可以借助mutex. 另外当…
如果你还在使用传统的C++,那么可以肯定堆内存的管理让你头痛过!在传统的C++领域,堆内存管理上我们能借用的现成工具就只有auto_ptr.但是很不幸用auto_ptr管理堆内存简直就是个错误.auto_ptr的问题可以归结为两点: 不能配合STL容器一起使用.将auto_ptr置于容器中,就是个编译错误(如果是一个编译错误,你得感谢,还好编译期就发现了) 不能管理动态数组.auto_ptr只能管理单个对象指针,如果指针是通过new T[num]的方式生成的,那不好意思了,这个就是个埋得比较深的…
Then what's really happening is TWO different sections of memory are being allocated. It's done at one time,  but it's two "logical" blocks. One is the int which stores the actual value, and the other is the control block,  which stores all the…
c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你确信需要 shared_ptr,否则请将该指针用作 POCO 的默认选项. 可以移到新所有者,但不会复制或共享. 替换已弃用的auto_ptr. 与 boost::scoped_ptr 比较. unique_ptr 小巧高效:大小等同于一个指针且支持 rvalue 引用,从而可实现快速插入和对 ST…
1.抛弃临时对象,让所有的智能指针都有名字. 2.类向外传递 this 的  shared_ptr 让类继承   enable_shared_from_this. 然后返回  shared_from_this(); 3. 例子有时间再补上.…