由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 为什么C++的constructor出错可以抛出异常,而destructor出错
相关主题
问几道老题A problem about Heap and Stack.
问两道以前的Bloomberg题新Qualcomm面经
问个C++题包子呼唤大牛--问关于C++Destructor的问题 (转载)
Two C++ questions from Bloomberg on-site问个C++重新编译的问题
C++ online Test 一题C++面试问题,高人请进啊~~~
Char x[] = "abc"; 是在heap还是stack上? (转载)请教1个工作面试题
请教个C++编程思路One C++ question
A malloc/free question using C/C++面经: bloomberg 电面
相关话题的讨论汇总
话题: 异常话题: destructor话题: 抛出话题: 出错
进入JobHunting版参与讨论
1 (共1页)
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

1 (共1页)
进入JobHunting版参与讨论
相关主题
面经: bloomberg 电面C++ online Test 一题
C++ Q65: recompiling (IB)Char x[] = "abc"; 是在heap还是stack上? (转载)
C++相关的面经请教个C++编程思路
小公司web server面经A malloc/free question using C/C++
问几道老题A problem about Heap and Stack.
问两道以前的Bloomberg题新Qualcomm面经
问个C++题包子呼唤大牛--问关于C++Destructor的问题 (转载)
Two C++ questions from Bloomberg on-site问个C++重新编译的问题
相关话题的讨论汇总
话题: 异常话题: destructor话题: 抛出话题: 出错