delete和析构函数间的关系及细节
2017-09-11 22:28
531 查看
http://blog.sina.com.cn/s/blog_78c5ff950102vjoe.html
个人心得:先看以下代码
#include
#include
using namespace std;
class shape
{
public:
char x;
shape(char m)
{
x=m;
cout << "构造"<<endl;
cout <<x<<endl;
}
~shape()
{
cout << "析构"<<endl;
cout<<x<<endl;
}
};
int main()
{
shape a('a');
shape* b = new shape('b');
delete b;
system("pause");
return 0;
}
当有那句delete b时,运行结果如图,
也就是说delete b之后执行了shape的析构函数,而按了任意键之后,会立马闪出一个析构a来,这说明程序执行完成后,即在a所在的作用域结束后,执行了shape的析构函数
而当没有delete b时,运行结果如图
,
这说明暂时没有执行b的shape析构函数,按了任意键后,跟上面一样,也只会闪出一个析构a来,没有析构b
这说明,直接声明的对象,比如shape a,即在栈上面的对象,所在作用域结束后,会自动执行析构函数,而new出来的在堆上的对象,不调用delete,即使它所在的作用域已经结束,也不会调用析构函数,根据另外一篇文章内所述,可能程序结束后,OS(操作系统)会回收其堆内占用的内存,这样就不知道会干什么,会不会调用析构了。
delete详解:首先调用析构函数,完成类成员的释放,比如类成员有vector也指向了堆上的内存,就需要在析构函数中同样使用delete释放这块内存,或者说它自身处于一个容器当中,就需要在这个容器中erase它
然后再free掉整个对象的内存;
delete b过后,b仍然指向改内存,即地址不变,但指针可能为悬垂指针,访问它可能带来意想不到的结果,也可能正确访问,不确定,所以建议delete后,把指针设置成NULL,后面也可根据指针是否为NULL判断是否可用。
个人心得:先看以下代码
#include
#include
using namespace std;
class shape
{
public:
char x;
shape(char m)
{
x=m;
cout << "构造"<<endl;
cout <<x<<endl;
}
~shape()
{
cout << "析构"<<endl;
cout<<x<<endl;
}
};
int main()
{
shape a('a');
shape* b = new shape('b');
delete b;
system("pause");
return 0;
}
当有那句delete b时,运行结果如图,
也就是说delete b之后执行了shape的析构函数,而按了任意键之后,会立马闪出一个析构a来,这说明程序执行完成后,即在a所在的作用域结束后,执行了shape的析构函数
而当没有delete b时,运行结果如图
,
这说明暂时没有执行b的shape析构函数,按了任意键后,跟上面一样,也只会闪出一个析构a来,没有析构b
这说明,直接声明的对象,比如shape a,即在栈上面的对象,所在作用域结束后,会自动执行析构函数,而new出来的在堆上的对象,不调用delete,即使它所在的作用域已经结束,也不会调用析构函数,根据另外一篇文章内所述,可能程序结束后,OS(操作系统)会回收其堆内占用的内存,这样就不知道会干什么,会不会调用析构了。
delete详解:首先调用析构函数,完成类成员的释放,比如类成员有vector也指向了堆上的内存,就需要在析构函数中同样使用delete释放这块内存,或者说它自身处于一个容器当中,就需要在这个容器中erase它
然后再free掉整个对象的内存;
delete b过后,b仍然指向改内存,即地址不变,但指针可能为悬垂指针,访问它可能带来意想不到的结果,也可能正确访问,不确定,所以建议delete后,把指针设置成NULL,后面也可根据指针是否为NULL判断是否可用。
相关文章推荐
- delete 和 析构函数的关系
- C++中的析构函数和delete的关系
- delete和析构函数的关系
- 数组名与指针的关系 细节
- 关于构造函数 析构函数和虚函数的关系
- Effective C++:条款6:析构函数里对指针成员调用delete
- 一个delete和析构函数引发的coredump
- 第36天(就业班) spring引入、专业术语、spring六大模块、bean创建对象的细节、IOC容器、对象依赖关系、自动装配、注解方式
- php对象引用和析构函数的关系
- C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系
- Qt父子对象的delete关系
- C++构造函数与析构函数的调用关系讨论
- 析构函数、赋值操作符与复制构造函数关系的分析
- effective C++笔记之条款6:析构函数里对指针成员调用delete
- 如何实现关系表的级联删除(ON DELETE CASCADE的用法)
- Effective C++条款6:析构函数里对指针成员调用delete
- C++ 析构函数以及 delete 和delete[]的整理
- Handler Looper Messagequeue Message 细节以及关系
- Effective C++ 第二版 5)new和delete形式 6) 析构函数里的delete
- 一个小栗子理解exit(1)与调用析构函数的关系