C++常见内存错误

内存错误:
1.内存分配没有成功,但是使用了它,如下:

#include <stdio.h>
#include <stdlib.h>
int main(int argc,char* argv[])
{
	int *p = (int*) malloc(sizeof(int)*200);
	*p = 300;
	return 0;
}

由于此次的申请的内存太大或者系统没有找到合适的空间去分配,会抛出内存不足的异常,并将NULL赋给p,如果以后使用了p指向的空间,会报错并且程序奔溃。

2.内存分配成功,但是没有初始化。

#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	int *p = (int*) malloc(sizeof(int)*200);
	cout << *p;
	return 0;
}

程序将会输出随机值。
3.内存分配成功,但是越界使用。这种情况下,如果进程对越界的地址空间有访问权限,则有可能输出越界地址中的内容,有可能是随机值,有可能是正常值,而这种情况比没有权限非法访问内存报错更严重。因为程序不可预测,会导致不可知的结果。
4.忘记释放内存,导致内存泄露。
5.释放了内存但是使用了它。
不要忘记为数组和动态内存赋值,防止将未初始化的内存作为右值使用。

野指针的产生原因:
1.释放了指针但是没有赋空,如下:

	int *p = (int*) malloc(sizeof(int));
		free(p);
		//p  = NULL;

这种情况下,p的值并不是0,而是之前申请空间的地址值。如果使用了p,就是非法访问内存。

2.指针没有初始化,初始化是随机值,所以指针初始化为NULL要么初始化为有效的内存空间。

char *p = NULL;
char *str = (char *) malloc(100);

3.超出了指针变量的作用域,还去使用它。比如:

int * fun()
{
	int p[] = {1,2};
	cout << p[1];
	return p;
}
int main()
{
	int *p = NULL;
	p = fun();
	return 0;
}

此时返回的p的值已经没有意义,使用可能出错也可能正常,但得不到理想的输出。

使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查,或者使用更安全的智能指针。
如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值