构造函数中,类的成员函数中出现了异常,析构函数能否正常调用

此处引用了某个人的帖子的回复,我觉得回答得不错,引用一下:

**在c++中,内存分为heap(堆区)--放置由new动态分配的内存,stack(栈区)--放置临时(局部)变量,和静态存储区--放置静态和全局变量;
**非局部静态变量,在main()函数前由编译器分配内存并初始化(构造),在main()结束后由编译器将其占用的内存释放(析构),所以这部分内存只要程序不结束就不会释放;
**局部变量在程序执行过程中由编译器自动产生和销毁;
**heap对象由new分配内存,必须由程序员通过delete释放掉内存;
内存泄露一般都是发生在堆对象身上;
你举的例子:
class B:public A
{
public:
B(int i):A(i)
{
}
}
构造函数并没有动态分配内存,所以不管对对象的构造能不能成功,你都不必担心内存泄露,编译器帮你做了所以的工作 :)
**若在构造函数中有动态内存的分配,通过new,你也应该在析构函数中用delete将内存释放;但若在构造函数中发生了异常(在new语句后),如果没有异常处理函数,构造函数将退出,由于对象没有被完全构造,对象的析构函数将不被调用,也就是delete语句没有被执行,发生内存泄露;
**解决办法:使用smart pointer(智能指针),已经写了很多了,就不在罗嗦了,若还不太明白何以和我联系。

总结一下:

1不要在构造函数和析构函数抛出异常。

2如果在构造函数发生了异常,因为构造函数没有完全初始化,所以发生异常的时候,是不会调用析构函数的。

3如果是类中的成员函数发生了异常,则会调用析构函数,代码为证:

#include<iostream>
#include<string>
using namespace std;
class A{
public:
A(int* a){
p=new int;
*p=*a;
}
~A(){
cout<<"调用析构"<<endl;
delete p;
}
void show(){
int ac=3;
try{
throw ac;
}catch(int){
cout<<"抛出异常"<<endl;
}
}
private:
int *p;


};
int main(){
int x=100;
int *b=&x;
A a(b);
a.show();
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值