r****o 发帖数: 1950 | 1 看了一些资料还是没搞明白为什么C++的constructor出错可以抛出异常,
而destructor出错不可以抛出异常。
有知道的能说说吗? |
f****4 发帖数: 1359 | 2 这里的“destructor出错不可以抛出异常”不是说c++语法禁止你这么做
而是在exception 抛出之后,正常代码的执行持续被打断,进入异常处理阶段
同时,所有的local 对象都要call destructor
c++异常处理同时只能处理1个异常
所以如果你允许在destructor抛出异常的话,就有可能在stack unwinding的过程中,
有2个异常————结果就是程序abort()
所以有“destructor出错不可以抛出异常”的说法 |
r****o 发帖数: 1950 | 3 多谢多谢,我C++比较弱。
你的意思是不是说如果destructor 抛出一个异常(第一个),所有的local 对象都要
call destructor, 这其中又可能出错,可能会抛出第二个异常,这样程序就不知道该
处理哪个异常了。
再请问一下,为什么constructor出错又可以抛出异常呢?
【在 f****4 的大作中提到】 : 这里的“destructor出错不可以抛出异常”不是说c++语法禁止你这么做 : 而是在exception 抛出之后,正常代码的执行持续被打断,进入异常处理阶段 : 同时,所有的local 对象都要call destructor : c++异常处理同时只能处理1个异常 : 所以如果你允许在destructor抛出异常的话,就有可能在stack unwinding的过程中, : 有2个异常————结果就是程序abort() : 所以有“destructor出错不可以抛出异常”的说法
|
f****4 发帖数: 1359 | 4 "constructor出错又可以抛出异常"
c++其实没有禁止任何函数抛出异常(包括destructor也能抛出异常)
constructor抛出异常,你try catch处理一下就好了;和其他抛出异常的函数一样
你把effective c++和more effective c++看2遍,很多细节就都明白了 |
C******a 发帖数: 32 | 5 You can throw an exception inside constructor, but then the destructor won't
be called. So your data members need to release their own resources; for
example don't allocate memery to a raw pointer member, instead use a shared_
ptr.
【在 r****o 的大作中提到】 : 看了一些资料还是没搞明白为什么C++的constructor出错可以抛出异常, : 而destructor出错不可以抛出异常。 : 有知道的能说说吗?
|
f****4 发帖数: 1359 | 6 有几点说明一下
第一,如果有 exception在constructor里面被抛出,那么当前对象并没有创建成功,也就没有所谓的destructor可以调用
第二, 在constructor里面allocate 资源的时候,用smart ptr,不要用raw pointer; smart ptr能保证到出异常为止,所有正常分配的资源自动释放
第三,在constructor里面发生异常的时候,分配给当前object的memeory不会泄露;这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自动释放分配给当前object的memeory
't
shared_
【在 C******a 的大作中提到】 : You can throw an exception inside constructor, but then the destructor won't : be called. So your data members need to release their own resources; for : example don't allocate memery to a raw pointer member, instead use a shared_ : ptr.
|
r****o 发帖数: 1950 | 7 多谢。
,也就没有所谓的destructor可以调用
; smart ptr能保证到出异常为止,所有正常分配的资源自动释放
这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自
动释放分配给当前object的memeory
【在 f****4 的大作中提到】 : 有几点说明一下 : 第一,如果有 exception在constructor里面被抛出,那么当前对象并没有创建成功,也就没有所谓的destructor可以调用 : 第二, 在constructor里面allocate 资源的时候,用smart ptr,不要用raw pointer; smart ptr能保证到出异常为止,所有正常分配的资源自动释放 : 第三,在constructor里面发生异常的时候,分配给当前object的memeory不会泄露;这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自动释放分配给当前object的memeory : : 't : shared_
|
i****h 发帖数: 321 | 8 我不太明白第二点。你说的是allocator自动用了smart ptr还是我们必须这样写?
谢谢。
,也就没有
所谓的destructor可以调用
; smart
ptr能保证到出异常为止,所有正常分配的资源自动释放
这是有
compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自动释放
分配给当前
object的memeory
【在 f****4 的大作中提到】 : 有几点说明一下 : 第一,如果有 exception在constructor里面被抛出,那么当前对象并没有创建成功,也就没有所谓的destructor可以调用 : 第二, 在constructor里面allocate 资源的时候,用smart ptr,不要用raw pointer; smart ptr能保证到出异常为止,所有正常分配的资源自动释放 : 第三,在constructor里面发生异常的时候,分配给当前object的memeory不会泄露;这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自动释放分配给当前object的memeory : : 't : shared_
|
r****o 发帖数: 1950 | 9 应该是建议我们这样用smart ptr把。
【在 i****h 的大作中提到】 : 我不太明白第二点。你说的是allocator自动用了smart ptr还是我们必须这样写? : 谢谢。 : : ,也就没有 : 所谓的destructor可以调用 : ; smart : ptr能保证到出异常为止,所有正常分配的资源自动释放 : 这是有 : compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自动释放 : 分配给当前
|
B*M 发帖数: 1340 | 10 destructor 被调用可能就是异常引起的,
如果再继续抛出异常,也不会得到正确的处理,
【在 r****o 的大作中提到】 : 多谢多谢,我C++比较弱。 : 你的意思是不是说如果destructor 抛出一个异常(第一个),所有的local 对象都要 : call destructor, 这其中又可能出错,可能会抛出第二个异常,这样程序就不知道该 : 处理哪个异常了。 : 再请问一下,为什么constructor出错又可以抛出异常呢?
|
s********a 发帖数: 1447 | 11 第二, 在constructor里面allocate 资源的时候,用smart ptr,不要用raw pointer;
smart ptr能保证到出异常为止,所有正常分配的资源自动释放
恩? 我怎么觉得应该是 auto-ptr
,也就没有所谓的destructor可以调用
; smart ptr能保证到出异常为止,所有正常分配的资源自动释放
这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自
动释放分配给当前object的memeory
【在 f****4 的大作中提到】 : 有几点说明一下 : 第一,如果有 exception在constructor里面被抛出,那么当前对象并没有创建成功,也就没有所谓的destructor可以调用 : 第二, 在constructor里面allocate 资源的时候,用smart ptr,不要用raw pointer; smart ptr能保证到出异常为止,所有正常分配的资源自动释放 : 第三,在constructor里面发生异常的时候,分配给当前object的memeory不会泄露;这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自动释放分配给当前object的memeory : : 't : shared_
|
s********a 发帖数: 1447 | 12 不是
【在 r****o 的大作中提到】 : 应该是建议我们这样用smart ptr把。
|
f****4 发帖数: 1359 | 13 smart ptr是个概念;auto_ptr,shared_ptr是实现
;
【在 s********a 的大作中提到】 : 第二, 在constructor里面allocate 资源的时候,用smart ptr,不要用raw pointer; : smart ptr能保证到出异常为止,所有正常分配的资源自动释放 : 恩? 我怎么觉得应该是 auto-ptr : : ,也就没有所谓的destructor可以调用 : ; smart ptr能保证到出异常为止,所有正常分配的资源自动释放 : 这是有compiler自动完成的,可以理解成,一旦constructor fail,异常处理程序会自 : 动释放分配给当前object的memeory
|