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
posted @   _Ong  阅读(13551)  评论(0编辑  收藏  举报
编辑推荐:
· 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代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示