首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于 delete 与析构函数,该如何解决

2012-07-29 
关于 delete 与析构函数例有一个类AA{public~A(){}int *p}A *a new A()delete a问题:(1)delete是用

关于 delete 与析构函数
例有一个类A
A
{
public;
~A(){}
int *p;
};

A *a = new A();

delete a;

问题:
(1)delete是用来释放一段内存吗?它是调用析构函数来完成的吗?
(2)delete只是用来调用析构函数吗?还是它在调用析构函数之前或(和)之后还会做其他工作?还要作些什么工作?
(3)释放后指针还指向原内存吗,还是指向了其它位置?
(4)释放后原内存的内容发生了什么变化?
(5)释放后指针自身所在地址发生了变化没?

问题较多也较混乱,关键是不明白:
(1)delete工作原理
(2)析构函数工作原理
(3)释放是什么意思

关于析构函数:
对于new与delete有一个原则是:
谁new谁delete

如果是在类的成员函数里new的,由谁来释放呢?类还是该成员函数?

实在迷惑,
诚望高手赐教!!!


[解决办法]
(1)delete是用来释放一段内存吗?它是调用析构函数来完成的吗?
先调用析构函数, 再释放内存
(2)delete只是用来调用析构函数吗?还是它在调用析构函数之前或(和)之后还会做其他工作?还要作些什么工作?
先调用析构函数, 再释放内存
(3)释放后指针还指向原内存吗,还是指向了其它位置?
指向原内存
(4)释放后原内存的内容发生了什么变化?
这块内存标记为空闲, 所以内容是不确定的, 可能会存在还是原内容的情况, 也可能是其他内容
(5)释放后指针自身所在地址发生了变化没?
这个在指针变量声明出来的时候就定了, 不会变了
int a; 
这个a的地址就不会变。 一样的

[解决办法]
要想知道delete的过程,必须先知道new的过程
通常new有三个过程:
1.获得内存空间,就是malloc干的事情
2.调用构造函数
3.返回相应指针
也就是说我们可以先用malloc获得相应空间p,在使用new(p)A(...)来调用构造函数,具体啥的可以搜“深入C++的new”

1.是的,先调用析构,再调用类似于free的释放内存,不是析构释放内存
2.调用析构完了才开始释放内存
3.指向原内存,如果不置空的话就是wild pointer了,会产生很多bug
4.不确定
5.不会

热点排行