C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用,
在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃,
所以为了省时间一般都是任由这个内存泄漏发生.
当然也可以经过复杂的设计,由一个监控线程来统一删除,
但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的.
shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放。
我们来测试看看效果
1 //C++11 shared_ptr 智能指针 的使用,避免内存泄露 2 #include <iostream> 3 #include <memory> 4 using namespace std; 5 6 #define _PRT(T) std::shared_ptr<T> 7 8 //定义 shared_ptr<T> 的智能指针 9 #define _PRTO(T,N,...) std::shared_ptr<T> N(new T(##__VA_ARGS__)) 10 11 //定义 shared_ptr<T> 的数组智能指针 12 #define _PRTA(T,N,n) std::shared_ptr<T> N(new T[n]) 13 14 class A { 15 public: 16 int n; 17 A(int n):n(n) { 18 cout <<n<< " construct A!!!" << endl; 19 } 20 ; 21 ~A() { 22 cout <<n<< " destruct A!!!" << endl; 23 } 24 ; 25 void Out(){ cout << n * 2 << endl; } 26 }; 27 class B : public A { 28 public: 29 B(int n):A(n) { 30 cout <<n<< " construct B!!!" << endl; 31 } 32 ; 33 ~B() { 34 cout <<n<< " destruct B!!!" << endl; 35 } 36 ; 37 _PRT(A) geta(int n) { _PRTO(A,a,n); return a; } 38 39 void chars() { 40 //使用智能指针指向 char[],以自动释放 41 _PRTA(char,p,1024*1024); 42 strcpy(p.get(), "std::shared_ptr<char*>"); 43 printf(p.get()); 44 } 45 46 }; 47 int main() { 48 B* ptrB0 = new B(1); 49 ptrB0->Out(); 50 51 _PRT(B) ptrB1(new B(2)); 52 ptrB1->Out(); 53 _PRT(A) a = ptrB1->geta(5); 54 a->Out(); 55 //复制了指针,增加引用计数 56 _PRT(B) ptrB2 = ptrB1;57 _PRT(A) b = ptrB2->geta(6); 58 b->Out(); 59 ptrB2->Out(); 60 61 //使用智能指针,会自动释放 62 for(int i=100;i;i--) 63 ptrB2->chars(); 64 }
测试程序中循环了100次,每次 new 了1Mb的内存, 调试过程中可以看到每次循环完内存都没有增长;
并且main执行完后,直接new的 类1 没有释放, 而类2自动释放了,
并且 如果有赋值给其他shared_ptr指针, 指针指向的对象不会释放,即指针指向的对象不会失效, 除非所有指向此对象的指针都无效了/不用了, 此对象才会自动释放.
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
原文链接:https://www.cnblogs.com/lzpong/p/6188034.html
--- auth:lzpong
分类:
C/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!