delete调用析构函数,c++ delete数组
大家好,今天小编来为大家解答delete调用析构函数这个问题,c++ delete数组很多人还不知道,现在让我们一起来看看吧!
delete运算符与析构函数什么关系
析构释放资源 delelte释放内存
看着好象有点一样其实关系并不大
我认为delete和析构关系是:前者是后者执行充分条件,后者对前者没有必然的影响
1.对象只在其生命周期结束时自动调用析构函数释放对象资源
而delete这个动作是释放对象就是标志生命周期结束所以必然引起析构动作
所以delete是析构的充分条件
2.而析构函数调用只是会可能使用delete来释放对象某些成员占用的内存
达到释放整体资源的目的。但是注意只是可能调用delete如果成员没有动态占用
那么就没有必要delete。所以后者对前者不必然联系
C++ delete命令的原理是什么
我们编译出来的程序运行时是和操作系统打交道的,程序中用到的内存都向操作系统申请,在多任务的操作系统下,不允许普通的程序访问未分配的内存。
操作系统手里有一张表,标明内存中的哪些单元被哪个程序占用了,哪些是空闲的(空闲不一定是空值,我们编写的程序如果动态变量没有初始化往往会带有不定值,就是这个缘故),当程序提出申请,它就把空闲的内存分配给程序。程序运行完后操作系统再把分配给的内存标记为空闲,以供其他程序用。
其实我们完全留意到,向磁盘写东西的时候很慢,但把写进了的东西删掉的时候却快得多,原因就在于操作系统删除文件的时候偷懒了,并没有彻底粉碎文件的每一个数据,而是在那张文件分配表上将这个文件所在的区域标记为空闲罢了,多数数据仍然在那里,从而给数据恢复软件留下了后门。
楼主的程序前面会申请空间来存放类A和B的对象。执行到delete就会去内存的堆区将指定的内存单元交还给操作系统。所以必须和new配套使用,否则会酿成严重后果。
我个人的猜测,执行delete只是将它后面变量的地址告诉给操作系统,操作系统把它手里的那张表给改了,但delete掉的指针没有变化,还是原来指向的变量的地址值。可以运行一下这个小程序:
#include<iostream.h>
int main(void)
{
int*p;
p=new int;
cout<<(unsigned int)p<<endl;//1
delete p;
cout<<(unsigned int)p<<endl;//2
p=NULL;
cout<<p;
return 0;
}
可以看到,delete前后,指针p的值没有变化。但是如果将2处改为cout<<*p;就要出问题了,操作系统会阻止程序去访问这个地址(表现为访问冲突,Access Violation),因为这个地址已经用delete归还给操作系统了。这时候的指针p叫做悬空状态,也就是野指针,怎么称呼都无所谓。它并没有被销毁,通过重新取其他变量的地址,还可以继续访问*p,但现在不行。
指针实际上是一个无符号整型变量,几乎所有我们碰到的指针,在C++下都是4个字节,因为C++在32位机上将int实现得和long int一样大小。
那么为什么要给指针规定类型呢?我猜测,这一方面是为了访问它指向的对象时确定读取内存单元的长度,比如char型变量占1个字节,int型变量占4个字节,类对象和结构体对象占的长度更加多样化,当定义了一个char型指针p,执行*p时程序只读取一个字节的内容,如果p是int型则*p读取4个连续的字节的内容。还有指针相加减,指针自增自减运算,都可以通过这个来确定一次移动的长度。
另一方面,也防止乱指发生意外吧,C语言中printf和scanf的格式控制串就要用的时候亲自设定,如果设不对运行时就可能出错。
析构函数的调用问题
为变量分配内存时可以选择分配在栈上,也可以分配在堆上。
栈是程序运行时就分配好的一块内存空间,这里一般存放临时变量,比如你在函数内定义了一个变量int a= 0;a就是分配在栈上了。这种变量不需要你去销毁,程序运行时随时去重复利用这些内存。
堆是一大块未分配的空间,你可以把你的变量分配在堆上,如int*a= new int(1);这就在堆上分配的一块int型大小的内存,用指针a指向这块内存。
析构函数正常情况下什么也不做,析构函数的作用是给你一个机会去手动释放你在堆上分配的内存。如果你在析构函数里面delete掉你的内存,那析构时会自动执行这句,释放掉内存。但如果你不写这句,在程序结束之前这块内存是不会被释放的,你若将p指向其它地方,那这块内存就泄漏掉了。
当然如果你的程序很小,等到程序结束也不会有很多内存泄漏,这些问题当然没有影响。但如果程序运行时间很长,程序很大,那就要注意了。
delete应该加上,一个合格的程序员应该去关心每一个需要delete的内存,将所有情况都掌握在自己手中,而不是寄希望于系统。
delete调用析构函数和c++ delete数组的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!