从默认析构函数学习c++,new,delete,内存泄漏,野指针
默认析构函数
当系统没有显式定义析构函数,编译器同样会为对象定义一个默认析构函数,默认的析构函数只能释放普通数据成员所占用的空间,无法通过释放通过new和malloc进行申请的空间,因此避免内存泄漏,我们要显式的析构函数对申请的空间释放。
内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
动态分配内存:
new是C++中用于动态内存分配的运算符,在C语言中一般使用malloc函数。
(new后时候最好判断是不是分配成功,防止野指针!!(野指针是什么??你是不是想问?不告诉你))
int *p= new int;
if(p==NULL){
cout<<"没有分配成功还操作你妈呢!"<<endl; // 年轻人不要太气盛(2023/1/3)
exit(0);
}
野指针
野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。需对指针进行初始化,有时指针在free或delete后未赋值NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存(本来已经要丢弃的东西,你又捡回来了)。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。
new开辟空间分为俩种情况:
1. 开辟单变量地址空间:
int *a=new int //定义一个int类型的指针。
int *a=new int(3) //定义一个int类型指针并赋予初值3。
delete a;
2. 开辟数组空间:
int *a=new int[5] //定义一个int类型长度为5的数组并把地址赋给a指针。(注意‘[]’与‘()’的区别)
delete []a;
简单来说,你new的时候加'[]'释放也加‘[]’,你new的时候没加释放也不用加(前面的肯定正确),有时候你new的时候加了‘[]’释放也可以不加,现在我还没明白。释放完成后需要把指针置为空,防止野指针。a=null;
零星见解
其实指针数组与普通数组很相似
比如定义数组 a[5],*p;数组有个首地址,访问数组就是通过首地址来访问。
*P指针指向数组就是指向首地址。数组可以的用a[n]访问第n+1的空间,指针也可以用*p[n]访问第n+1的空间
如果函数的形参是类的对象,则在进行函数调用时,将自动调用复制构造函数,这也是复制构造函数中的形参如果不是对象引用会造成无限循环调用的原因
例如:X a(b)按值传递时,用X类的对象b初始化X类对象的a,会引起拷贝构造函数得调用,在调用X a(X obj)时,按值传递实参b初始化obj时又要调用拷贝构造函数造成了,X(X)的无限循环。
假如:X a(b)按引用传递时,用X类的对象b初始化X类对象的a,会引起拷贝构造函数得调用,在调用 X a(X &obj)时,obj就是b的别名,不会引起拷贝构造函数的调用。
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/11005884.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了