C++——多次free和delete导致错误
2016-04-09 19:21
232 查看
多次free和delete将会导致错误:
指针变量本身也是一个变量,它本身也占有内存空间,我们可以用内存中其它内存空间的地址为其赋值。倘若我们不给指针变量给他赋值,而是直接操作这个指针变量,编译器会报错的,因为编译器检测到该指针变量没有初始化,就会认为这是语法错误。所以,使用初始化后的指针变量才是有意义的。delete和new的目的就是在堆内申请一个内存,将这个内存空间的首地址赋给一个指针变量。
free:一次free一个指针的时候,只是清空该指针所指的堆中的对应空间,但该指针变量在栈中的值并没有没清空,它还是指向原来分配的内存空间(但是该内存空间已经不属于该指针了,CPU随时可把该指针原来所指的空间分配给任何一个指针变量)。这时,再free一次时,由于该指针已经没有堆空间与之对应了,所以编译器将会提示出错。在C/C++编程时,malloc和new分配空间及free和delete释放空间是一个难点,这里很容易产生思维误区,所以在实际编程时需要千万注意手动分配的空间,要手动释放,万万不可多次释放同一堆空间。
free 释放这个指针占用的空间,释放后别的指针变量也可以得到这片空间,该空间的值并不一定是NULL。所以free后不能用是否为NULL来判断。
delete:当一个指针被delete后,该指针就成了野指针(不指向任何内存空间的指针我们称之为野指针,野指针所指向的地方是随机的)。当再次delete该指针时,编译器就会提示你操作非法。
指针变量本身也是一个变量,它本身也占有内存空间,我们可以用内存中其它内存空间的地址为其赋值。倘若我们不给指针变量给他赋值,而是直接操作这个指针变量,编译器会报错的,因为编译器检测到该指针变量没有初始化,就会认为这是语法错误。所以,使用初始化后的指针变量才是有意义的。delete和new的目的就是在堆内申请一个内存,将这个内存空间的首地址赋给一个指针变量。
free:一次free一个指针的时候,只是清空该指针所指的堆中的对应空间,但该指针变量在栈中的值并没有没清空,它还是指向原来分配的内存空间(但是该内存空间已经不属于该指针了,CPU随时可把该指针原来所指的空间分配给任何一个指针变量)。这时,再free一次时,由于该指针已经没有堆空间与之对应了,所以编译器将会提示出错。在C/C++编程时,malloc和new分配空间及free和delete释放空间是一个难点,这里很容易产生思维误区,所以在实际编程时需要千万注意手动分配的空间,要手动释放,万万不可多次释放同一堆空间。
free 释放这个指针占用的空间,释放后别的指针变量也可以得到这片空间,该空间的值并不一定是NULL。所以free后不能用是否为NULL来判断。
delete:当一个指针被delete后,该指针就成了野指针(不指向任何内存空间的指针我们称之为野指针,野指针所指向的地方是随机的)。当再次delete该指针时,编译器就会提示你操作非法。
相关文章推荐
- Let's Complain the Irresponsible keyword 'const' in C++
- c++作业3
- C++泛型之求未知数组的长度
- C++实验三
- c++模板实现栈
- 2016年蓝桥杯C++/c B组答案
- Getting Started with C++ in Visual Studio
- C++类内存分布
- C语言超大数相加求和、加减乘除算法实现
- C语言常用转义字符表 和 ASCII码表完整版
- 递归和尾递归的比较,斐波那契
- 3.10 左值和右值 中英文对照(C++标准中文版 ISO/IEC 14882:2014)
- C++虚继承内存布局
- C语言编程“Hello,world”
- Google的c++代码规范
- 队列的C++实现
- C++中的exit()函数
- 希尔排序算法的C语言实现示例
- C++ 读写文件
- 初步学习C++中的继承关系