1.函数返回值使用指针(不会用)
(1) 不要返回函数局部变量或临时变量的地址(该地址如果期间被其他变量征用,会导致结果出现各种不认识的值)
正确方法:
例:
int * add(int x,int y){
int *sum = NULL;
sum = new int;
*sum = x+y;
return sum;
}
int main(){
int a = 3;
int b = 4;
int *sum = NULL;
sum = add(a,b);
cout<<"sum = "<<*sum<<endl;
delete sum; //动态内存分配记得归还
}
(2)!! 返回静态局部变量的地址 没有 问题
2.内存常见错误总结[很多bug都是由于代码量巨大,遗忘部分操作后造成的]
(1)申请的内存多次释放:只允许释放一次
(2)内存泄漏:申请的动态内存没释放
(3)释放的内存不是申请时的地址:在进行一系列的指针操作后,指针可能已经不是最初申请动态内存的首地址了
(4)释放空指针:以为在代码运行中指针被赋值了,但是如果程序赋值那步出现了判定错误,
没有执行该语句,在下面释放指针时,就会出现错误
(5)释放一个内存块,但是继续引用其中的内容
(6)越界访问:动态内存也相当于一个数组,可能在对指针多次操作的过程中造成了越界访问
注:动态数组初始化:memset(指针,0,元素数量*sizeof(元素类型));
3.内存泄漏检测
内存泄漏检测工具:VisualC++ debugger 和CRT库
第一步:包含头文件
#define_CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
第二步:接管new操作符
#ifdef DEBUG
#ifndef DBG_NEW
#define DBG_NEW new(_NORMAL_BLOCK,_FILE_,_LINE_)
#define new DBG_NEW
#endif
#endif
第三步:在代码结束处输出内存泄露信息
_CrtDumpMemoryLeaks();
内存泄漏工具:
Windows:Purify,BoundsCheaker,Deleaker,VisualLeak Detector,
Linux: Valgrind,memcheck
注:用完记得把这些代码删掉