从默认析构函数学习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的别名,不会引起拷贝构造函数的调用。

posted @ 2019-06-11 20:44  帅气的涛啊  阅读(3129)  评论(0编辑  收藏  举报