内存泄露与野指针

一 、内存泄露

有资源申请,就要有资源的释放,否则会发生内存泄露(内存被耗光)。

你定义了一个变量,使用完这个变量之后却没有及时回收这部分内存,这时我们就说发生了内存泄露。如果发生了内存泄露又没有及时发现,随着程序运行时间的增加,程序越来越大,直到消耗完系统的所有内存,然后系统崩溃。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值