C++ 构造与析构的执行顺序
2015-05-30 17:40
211 查看
1、代码如下:
class A
{
public:
int _Id;
A():_Id(0)
{
printf("A[%d]\n",_Id);
}
~A()
{
printf("~A[%d]\n",_Id);
}
};
class B
{
public:
A _A;
A* _PA;
B()
{
printf("B\n");
}
~B()
{
printf("~B\n");
delete _PA;
}
};
int main(int argc, char* argv[])
{
{
B b;
b._PA = new A();
b._PA->_Id = 17;
}
return 0;
}
2、执行顺序
A[0]
B
A[0]
~B
~A[17]
~A[0]
3、B是栈上对象,C++保证栈上对象离开作用域,会自动调用析构方法。
4、考虑b中的对象,_A是栈上对象,_PA是指针,堆上对象,对于_PA必须delete,否则资源泄露。而对于_A不需要处理,会自动调用析构方法。可以这样理解,对象b离开作用域,调用析构方法,而b中的_A当然也离开了作用域(皮之不存毛将存焉),调用析构方法。
5、碰到过这样的情况,vs自动生成的析构方法有问题,导致崩溃。手动添加一个析构方法,就可以了。
class A
{
public:
int _Id;
A():_Id(0)
{
printf("A[%d]\n",_Id);
}
~A()
{
printf("~A[%d]\n",_Id);
}
};
class B
{
public:
A _A;
A* _PA;
B()
{
printf("B\n");
}
~B()
{
printf("~B\n");
delete _PA;
}
};
int main(int argc, char* argv[])
{
{
B b;
b._PA = new A();
b._PA->_Id = 17;
}
return 0;
}
2、执行顺序
A[0]
B
A[0]
~B
~A[17]
~A[0]
3、B是栈上对象,C++保证栈上对象离开作用域,会自动调用析构方法。
4、考虑b中的对象,_A是栈上对象,_PA是指针,堆上对象,对于_PA必须delete,否则资源泄露。而对于_A不需要处理,会自动调用析构方法。可以这样理解,对象b离开作用域,调用析构方法,而b中的_A当然也离开了作用域(皮之不存毛将存焉),调用析构方法。
5、碰到过这样的情况,vs自动生成的析构方法有问题,导致崩溃。手动添加一个析构方法,就可以了。
相关文章推荐
- 【Maximum Subarray 】cpp
- C语言编程优化运行速度
- C++ 学习笔记(二) 如何向Main函数传递参数
- C语言产生随机数的方法
- c++移动语义
- char[]数组名与指针,以及字符串数组与string的一些比较
- c++ try_catch throw
- c++:不要重新定义继承而来的non-virtual函数
- 如何在Visual Studio和CodeBlocks中反编译C++代码
- C语言快速排序
- C++ 小知识点之引用:“&”
- 【Triangle 】cpp
- 关于C++类的基础
- LeetCode 199. Binary Tree Right Side View
- C语言结构体变量内存分配与地址对齐
- LeetCode 198. House Robber
- C语言小知识点
- 【Container With Most Water】cpp
- c语言字符串 数字转换函数大全
- C语言实现栈的基本操作