我们用实际代码说明问题:先看一下如下代码:
#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
616

被折叠的 条评论
为什么被折叠?



