1 内存泄漏c++
形成内存泄漏的几种状况:程序员
①经过c语言的malloc系统函数以及c++的new运算符动态内配的内存空间,使用完以后程序员没有手动释放! ②在有异常处理的程序中,即时使用了free或者delete可是因为异常的缘由没有获得执行编程
/* 这里提供一段伪代码 */
try{
type* pointer = malloc(sizeof(type));
//此处抛出异常
free(pointer); //这里不会执行
}catch(...){
//捕捉到异常
}
复制代码
2 野指针的使用bash
基本概念:野指针指的是指向"垃圾"内存的指针函数
指针变成野指针的状况概述:ui
①free或者delete以后的指针,free和delete只是释放了该指针指向的内存空间,"可是该指针的值仍是malloc或者new分配的内存的地址",继续使用它去访问这个内存地址是会发生错误的!spa
注意:当释放掉动态内存空间以后,将先前指向它的指针的值设置为NULL;在建立指针变量的时候,给指针一个初始值,由于不指定初始值的话,指针的值是随机的,这有时候会致使不可预期的错误!指针
建议:定义指针变量的时候尽可能初始化,哪怕初始化为NULL也好;这是一个很好的编程习惯!code
②将局部变量的地址返回生命周期
出现的问题:由于a是局部变量,只有在func函数做用域中有效,它的内存空间是属于栈内存的,一旦func执行完以后,系统会自动回收它的内存空间,因此再次使用的话会发生错误!
解决方法:将局部变量使用static修饰,由于在c++中,static修饰的变量的生命周期是整个程序运行期间,与程序"同生共死";
int* func(){
int a = 8;
return &a;
}
int main(){
int* p = func();
cout<<"p:"<<*p<<"\n";
}
复制代码
3 NULL指针
出现NULL指针的状况
①使用malloc或者new动态分配内存的时候:
对于malloc和new来讲,当内存分配失败的时候回返回NULL,因此若是不作判断的话就会发生错误;
②当使用指针做为函数的参数的时候:
对于含有指针参数的函数来讲,当使用者传入一个NULL的指针的话也是会发生错误的;
注意:为了不以上两种状况的发生,咱们再程序中加一个if判断
if (pointer == NULL)
中止执行任务
复制代码