首页技术delete调用析构函数,c++ delete数组

delete调用析构函数,c++ delete数组

编程之家2026-06-08991次浏览

大家好,今天小编来为大家解答delete调用析构函数这个问题,c++ delete数组很多人还不知道,现在让我们一起来看看吧!

delete调用析构函数,c++ delete数组

delete运算符与析构函数什么关系

析构释放资源 delelte释放内存

看着好象有点一样其实关系并不大

我认为delete和析构关系是:前者是后者执行充分条件,后者对前者没有必然的影响

1.对象只在其生命周期结束时自动调用析构函数释放对象资源

而delete这个动作是释放对象就是标志生命周期结束所以必然引起析构动作

所以delete是析构的充分条件

delete调用析构函数,c++ delete数组

2.而析构函数调用只是会可能使用delete来释放对象某些成员占用的内存

达到释放整体资源的目的。但是注意只是可能调用delete如果成员没有动态占用

那么就没有必要delete。所以后者对前者不必然联系

C++ 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数组的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

行秋圣遗物 行秋圣遗物词条推荐ai外呼(ai外呼费用)