构造函数中,类的成员函数中出现了异常,析构函数能否正常调用
来源:互联网 发布:软件功能模块设计文档 编辑:程序博客网 时间:2024/06/05 05:43
此处引用了某个人的帖子的回复,我觉得回答得不错,引用一下:
**在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;
}
- 构造函数中,类的成员函数中出现了异常,析构函数能否正常调用
- C++中 构造函数 析构函数 能否调用虚函数的问题
- 构造函数和析构函数,在C++中能否声明为虚函数?构造函数和析构函数里面能否调用虚函数?
- 在成员函数中调用构造函数
- c++能否在析构函数和构造函数中抛出异常?
- 构造函数中调用虚函数能否实现多态
- 构造函数中调用虚成员函数问题
- 构造函数、析构函数中调用虚函数
- 在构造函数/析构函数中调用虚函数
- 在构造函数/析构函数中调用虚函数
- C++中类的构造函数与析构函数(成员初始化列表)
- 函数调用 中 的拷贝构造函数
- C++面试题1:构造函数和虚构函数中能否调用虚函数?
- C++ 构造函数和虚构函数中能否调用虚函数?
- 关于构造函数 和 析构函数 能否抛出异常的讨论
- 关于构造函数 和 析构函数 能否抛出异常的讨论
- 在构造函数的参数化列表中调用基类构造函数初始化继承来的成员变量
- 在构造函数的参数化列表中调用基类构造函数初始化继承来的成员变量
- AJAX中文乱码解决
- 微软将在10月26日发布下一代操作系统Windows 8
- c#各种时间转换
- Creating Release Keys and Signing Builds
- [java]Spring AOP
- 构造函数中,类的成员函数中出现了异常,析构函数能否正常调用
- Trace files
- 编程规范的作用
- Android读取assets目录下的资源
- hdu1240
- 让Python在Android系统上飞一会儿
- How to Customize UITabBar on iOS 5
- Android 70道面试题汇总不再愁面试
- Customization