默认析构函数:
当系统没有显式定义析构函数, 编译器同样会为对象定义一个默认析构函数, 默认的析构函数只能释放普通数据成员所占用的空间, 无法通过释放通过 new 和 malloc 进行申请的空间, 因此避免内存泄漏, 我们要显式的析构函数对申请的空间释放.
内存泄漏 (Memory Leak) 是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放, 造成系统内存的浪费, 导致程序运行速度减慢甚至系统崩溃等严重后果.
动态分配内存:
new 是 C++ 中用于动态内存分配的运算符, 在 C 语言中一般使用 malloc 函数.
- (new 后时候最好判断是不是分配成功, 防止野指针!!(野指针是什么?? 你是不是想问? 不告诉你))
- int *p= new int;
- if(p==NULL)
- {
- cout<<"没有分配成功还操作你妈呢!"<<endl;
- exit(0);
- }
野指针指向一个已删除的对象或未申请访问受限内存区域的指针. 与空指针不同, 野指针无法通过简单地判断是否为 https://baike.baidu.com/item/NULL 避免, 而只能通过养成良好的编程习惯来尽力减少. 对野指针进行操作很容易造成程序错误. 需对指针进行初始化, 有时指针在 free 或 delete 后未赋值 NULL, 便会使人以为是合法的. 别看 free 和 delete 的名字(尤其是 delete), 它们只是把指针所指的内存给释放掉, 但并没有把指针本身干掉. 此时指针指向的就是 "垃圾" 内存. 释放后的指针应立即将指针置为 NULL, 防止产生 "野指针".
野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针.
new 开辟空间分为俩种情况:
开辟单变量地址空间:
- int *a=new int // 定义一个 int 类型的指针.
- int *a=new int(3) // 定义一个 int 类型指针并赋予初值 3.
释放: delete a;
开辟数组空间:
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 的空间
如果函数的形参是类的对象, 则在进行函数调用时, 将自动调用复制构造函数, 这也是复制构造函数中的形参如果不是对象引用会造成无限循环调用的原因....... 未完待续.
来源: https://www.cnblogs.com/handsometaoa/p/11005884.html