C++析构的调用时机是确定的,
正常就是退出变量的scope时调用,也就是fun1返回之前。
异常情况下就是unwind时调用,前提是捕捉到异常并触发了unwind操作。
异常分为os异常和c++异常,c++异常用try/catch就能捕捉处理。
所以你担心的是os异常?
os异常的处理自然和os有关,你的是啥os?
windows上用SEH/VEH都可以处理,简单点用SEH,就是VC++特有的关键字__try{ } __except{ } __finally{ },
但这些关键字和c++对象不能共存于同一层函数中,只能用于纯C的代码,所以如果有c++对象,需要额外再包一层函数。
vc++对catch(...)可以做特殊处理,同时捕捉c++异常、OS异常。
https://docs.microsoft.com/en-us/cpp/build/reference/eh-exception-handling-model?view=vs-2019
【 在 capriccio 的大作中提到: 】
: 我说异常情况主要还是想说明我问这个问题的目的。
: 比如fun1和fun2都里用到了某个资源,我需要在fun1出现任何异常退出后在fun2开始之前这个资源都会被释放。所以我就想整一个类,类的构造函数申请资源,析构函数释放资源。在fun1里一开始就声明一个这个类的对象,fun1不管时正常退出还是异常退出,都能保证资源释放。但我不确定这个析构函数什么时候被调用,是不是像垃圾回收那样不能确定具体时间,所以问了这个问题。
: 也不知道要实现我这个目的还有没有更好的办法(似乎标准库里一堆xxxptr的类可以干这个?但我对使用这些类没有安全感,因为看简单的文档还是很多细节不清楚,能讲清各种细节的文档看着太费劲,不如自己造轮子)
: ...................
--
FROM 125.33.231.*