关于发生时异常时,shared_ptr智能指针会自动析构的疑问?

论坛 期权论坛 工作     
爱用户   2019-10-11 13:20   1256   5
最近再看c++ primer 第五版书籍。关于shared_ptr智能指针的问题。文章中说到当发生异常时不管处不处理shared_ptr会自动析构。但是我写了demo测试下,发现没有调用析构函数,不知道为什么?小白请教各路大神。我在ubuntu 14.04下gcc version 4.8.4,在vs2013下都测试过。都没有调用析构函数。
下面是测试代码:
class Demo
{
public:
    Demo() { cout
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
热心回应  16级独孤 | 2019-10-11 13:20:10 发帖IP地址来自
首先, *p = 0 不会抛异常,而是直接 SEGFAULT。
其次,陈硕:为什么这段代码没有调用到析构函数?
3#
热心回应  16级独孤 | 2019-10-11 13:20:11 发帖IP地址来自
这属于操作系统眼中的异常而不仅是语言眼中的异常,所以你看语言的教科书是没用的。操作系统会临时接管你这个流程, 并且自顾自的处理,甚至可能处理完了就不交回控制权了。操作系统根本不管你用什么语言写的这个进程

4#
热心回应  16级独孤 | 2019-10-11 13:20:12 发帖IP地址来自
段错误就跟你直接 kill pid 一样属于内核态的行为,杀死进程的时候程序根本就不会正常走完设计好的过程,除非你手动处理 signal 了,C++ 的 exception 属于用户态,要触发也要用 throw。
5#
热心回应  16级独孤 | 2019-10-11 13:20:13 发帖IP地址来自
异常这个词到处都有cpu,操作系统等等层面都有异常。c++保证异常时析构会被调用,这里的异常仅仅是c++的异常,也就是c++ 里的throw。
6#
热心回应  16级独孤 | 2019-10-11 13:20:14 发帖IP地址来自
因为你没有catch,默认的catch是崩溃,所以析构前就崩溃了。

然后你下面那个会segment fault,不会拋异常。windows下的segment fault叫什么忘了,会触发unhandled exception,当然默认行为也是崩溃

------
感谢评论里  @Cyandev 补充Windows里叫Access Violation
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:31799
帖子:6375
精华:1
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP