C++ 栈展开如何防止内存泄露
发布日期:2021-06-29 19:19:39
浏览次数:2
分类:技术文章
本文共 1039 字,大约阅读时间需要 3 分钟。
在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在栈上的局部变量都要被释放。如果被释放的变量中有指针,而该指针在此前已经用new运算申请了空间,就有可能导致内存泄露。因为栈展开的时候并不会自动对指针变量执行delete(或delete[])操作。
因此,在有可能发生异常的函数中,可以利用“智能指针”unique_ptr来防止内存泄露。参考如下程序。
#include#include using namespace std;class A { int num;public: A(int i):num(i) { cout<<"this is A's constructor, num="< <
程序的输出结果:
this is A's constructor, num=1there is no destructor invokedthis is A's constructor, num=22this is A's destructor, num=2A's destructor does be invoked
在解读上面的这段程序的时候,要注意以下几点。
(1)在函数uniqueptrtest1()中,由于异常的发生,导致delete pa;
无法执行,从而导致内存泄露。 (2)unique_ptr实际上是一个类模板,在名称空间std中定义,要使用该类模板,必须包含头文件memory。unique_ptr的构造函数可以接受任何类型的指针,实际上是利用指针类型将该类模板实例化,并将传入的指针保存在unique_ptr< T>对象中。 (3)在栈展开的过程中,unique_ptr< T>对象会被释放,从而导致unique_ptr< T>对象的析构函数被调用。在该析构函数中,将使用delete运算符将保存在该对象内的指针所指向的动态对象被销毁。这样,就不会发生内存泄露了。 (4)由于已经对*和->操作符进行了重载,所以可以像使用普通的指针变量那样使用unique_ptr< T>对象,如上面程序中的pa->show()。这样可以保留使用指针的编程习惯,方便程序猿编写和维护。 参考文献
[1] 陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.P371-373
转载地址:https://dablelv.blog.csdn.net/article/details/50157297 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月06日 10时04分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
parameter passing
2021-07-03
sort & search algorithm
2021-07-03
design pattern
2021-07-03
算法-动态规划2
2021-07-03
算法-动态规划3
2021-07-03
算法-计算1的个数及python sort函数的多层排序
2021-07-03
regular expression examples
2021-07-03
subsets : zero left padding : leetcode 78
2021-07-03
python 模块导入注意事项
2021-07-03
quick sort
2021-07-03
自动为 Gatsby网站中的 Markdown 页面添加 sidebar
2021-07-03
leetcode 463. Island Perimeter
2021-07-03
第二个MacBook,继续加油!
2021-07-03
unittest source code learning
2021-07-03