一 、内存泄露
有资源申请,就要有资源的释放,否则会发生内存泄露(内存被耗光)。
你定义了一个变量,使用完这个变量之后却没有及时回收这部分内存,这时我们就说发生了内存泄露。如果发生了内存泄露又没有及时发现,随着程序运行时间的增加,程序越来越大,直到消耗完系统的所有内存,然后系统崩溃。
new 和malloc申请的内存都放在堆中,这部分内存,无法被操作系统自动收回去,需要对应的delete和free来收回去。
malloc/free 是库函数,在头文件cstdlib中。
new/delete 是运算符
注意:malloc/free 不能用于对象的构造和析构。一般而言c++的new/delete 可替代malloc/free,由于c++经常调用C,而C中的内存分配是用malloc/free,为了实现兼容性,没有完全取代malloc/free。
二、野指针
使用delete或free,仅仅是告诉操作系统,这一块的内存被释放,可以用作其他用途。但是由于没有对内存进行重新的读写操作,所以内存中的值并没有发生变化,出现野指针的情况。因此,一般释放完内存后,应该将指针指向置空。
/*******************************************************************************************************************************/
参考:http://www.cnblogs.com/submarinex/archive/2013/03/02/2940169.html
当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针)。
某些编程语言允许未初始化的指针的存在,而这类指针即为野指针。
/******************************************************************************************************************************/
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
void testfree()
{
char* str = (char*)malloc(100);
strcpy(str,"hello");
cout<<str<<endl;
free(str);
// str = NULL; 不这样做会出现野指针
if(str!=NULL)
{
strcpy(str,"world");
cout<<str<<endl;
}
}
int main()
{
testfree();
}
输出是:
hello
world
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
void testfree()
{
char* str = (char*)malloc(100);
strcpy(str,"hello");
cout<<str<<endl;
free(str);
str = NULL; //不这样做会出现野指针
if(str!=NULL)
{
strcpy(str,"world");
cout<<str<<endl;
}
}
int main()
{
testfree();
}
输出是:
hello