内存错误:
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)进行防错处理。