常见错误总结
1、申请的动态内存多次释放
delete和new的目的是在堆内申请一个内存,将这个内存空间的首地址赋给一个指针变量。
- free:一次free一个指针的时候,只是清空该指针所指的堆中的对应空间,但该指针变量在栈中的值并没有没清空,它还是指向原来分配的内存空间(但是该内存空间已经不属于该指针了,CPU随时可把该指针原来所指的空间分配给任何一个指针变量)。这时,再free一次时,由于该指针已经没有堆空间与之对应了,所以编译器将会提示出错。
- free 释放这个指针占用的空间,释放后别的指针变量也可以得到这片空间,该空间的值并不一定是NULL。所以free后不能用是否为NULL来判断。
- delete:当一个指针被delete后,该指针就成了野指针(不指向任何内存空间的指针我们称之为野指针,野指针所指向的地方是随机的)。当再次delete该指针时,编译器就会提示你操作非法。
代码如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
int *p = new int[18];
p[0] = 0;
delete[] p;
delete[] p;
system("pause");
return 0;
}
程序运行结果如下: