C++ 构造函数抛出异常会引起内存泄漏吗?

我们用实际代码说明问题:先看一下如下代码:
#include <iostream>

using namespace std;

class Inner

{

public:

Inner()

{

cout<<"Inner()/n";

}

~Inner()

{

cout<<"~Inner()/n";

}

};

 

class Outer

{

private:

int m_Value;

Inner inner1;

public:

Outer(int value):m_Value(value)

{

cout<<"Outer(int value)/n";

throw 3;

}

~Outer()

{

cout<<"~Outer()/n";

}

void* operator new(size_t size)

{

cout<<"void* operator new(size_t size)/n";

unsigned char* tmp = ::new unsigned char[size];

return tmp;

}

void operator delete(void* ptr)

{

cout<<"void* operator delete(void* ptr)/n";

::delete[] (unsigned char*)ptr;

}

};

 

main()

{

try

{

Outer* d = new Outer(1);

}

catch(...)

{

cout<<"exception got it/n";

}

}

 

这段代码编译后执行结果:

void* operator new(size_t size)

Inner()

Outer(int value)

~Inner()

void* operator delete(void* ptr)

exception got it

 

从代码执行结果来看,我们可以得出如下结论:

1.一个对象的生成有两个过程:

A.向系统申请内存空间

B.在申请的内存空间上执行构造函数,初始化对象。

2.内部对象构造先于对象本身。

3.对象在构造函数抛出异常后,系统会负责清理构造对象时申请的内存,但不会调用对象析构函数。

 

也就是说构造对象的内存会被释放掉,已经完成实例化的成员对象也会成功析构。

通过valgrind工具可以看到不存在内存泄漏。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/sxf_824/archive/2009/12/02/4926687.aspx

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值