多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用,

在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃,

所以为了省时间一般都是任由这个内存泄漏发生.

当然也可以经过复杂的设计,由一个监控线程来统一删除,

但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的.

shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放。

我们来测试看看效果

 //C++11 shared_ptr 智能指针 的使用,避免内存泄露
#include <iostream>
#include <memory>
using namespace std; #define _PRT(T) std::shared_ptr<T> //定义 shared_ptr<T> 的智能指针
#define _PRTO(T,N,...) std::shared_ptr<T> N(new T(##__VA_ARGS__)) //定义 shared_ptr<T> 的数组智能指针
#define _PRTA(T,N,n) std::shared_ptr<T> N(new T[n]) class A {
public:
int n;
A(int n):n(n) {
cout <<n<< " construct A!!!" << endl;
}
;
~A() {
cout <<n<< " destruct A!!!" << endl;
}
;
void Out(){ cout << n * << endl; }
};
class B : public A {
public:
B(int n):A(n) {
cout <<n<< " construct B!!!" << endl;
}
;
~B() {
cout <<n<< " destruct B!!!" << endl;
}
;
_PRT(A) geta(int n) { _PRTO(A,a,n); return a; } void chars() {
//使用智能指针指向 char[],以自动释放
_PRTA(char,p,*);
strcpy(p.get(), "std::shared_ptr<char*>");
printf(p.get());
} };
int main() {
B* ptrB0 = new B();
ptrB0->Out(); _PRT(B) ptrB1(new B());
ptrB1->Out();
_PRT(A) a = ptrB1->geta();
a->Out();
//复制了指针,增加引用计数
_PRT(B) ptrB2 = ptrB1; _PRT(A) b = ptrB2->geta();
b->Out();
ptrB2->Out(); //使用智能指针,会自动释放
for(int i=;i;i--)
ptrB2->chars();
}

测试程序中循环了100次,每次 new 了1Mb的内存, 调试过程中可以看到每次循环完内存都没有增长;

并且main执行完后,直接new的 类1 没有释放, 而类2自动释放了,

并且 如果有赋值给其他shared_ptr指针, 指针指向的对象不会释放,即指针指向的对象不会失效, 除非所有指向此对象的指针都无效了/不用了, 此对象才会自动释放.

最新文章

  1. cocoaPods 的使用
  2. JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析
  3. AssetBundle系列——场景资源之打包(一)
  4. org.apache.jasper.JasperException: Expecting &quot;jsp:param&quot; standard action with &quot;name&quot; and &quot;value&quot; attributes
  5. maven的学习系列(四)—创建maven项目注意事项
  6. httpcontext in asp.net unit test
  7. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
  8. XJOI网上同步训练DAY3 T2
  9. 关于SQL调优(Distinct 和 Exits)
  10. 安装Hadoop 2.7.3的过程中遇到的一些问题及解决方法。
  11. 简易付XP版本无法获取server.xml配置文件处理方案
  12. 4、jeecg 笔记之 自定义显示按钮 (exp 属性)
  13. word之高级
  14. scala 入门Eclipse环境搭建
  15. LINUX系统一一常用命令
  16. 识骨寻踪第十二季/全集Bones迅雷下载
  17. TQ2440触摸屏
  18. 20190416 OSX系统使用VMware Fusion安装CentOS7踩的那些坑
  19. 感受C#6.0新语法
  20. DSP资源分享贴

热门文章

  1. 平台之大势何人能挡? 带着你的Net飞奔吧!
  2. a标签点击跳转失效--IE6、7的奇葩bug
  3. 展望未来:使用 PostCSS 和 cssnext 书写 CSS
  4. Linux 常用命令(持续补充)
  5. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结
  6. .NET平台和C#编程的总结
  7. R abalone data set
  8. 浅谈Java的throw与throws
  9. Linux杀死进程,查看进程
  10. Android游戏开发实践(1)之NDK与JNI开发03