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
注:用完记得把这些代码删掉
??
??