《内存出错-内存泄露-数组越界-悬空指针-错误分配》由会员分享,可在线阅读,更多相关《内存出错-内存泄露-数组越界-悬空指针-错误分配(8页珍藏版)》请在金锄头文库上搜索。
1、 内存出错,内存泄露,数组越界,悬空指针,错误分配2010-06-01 10:43 879 人阅读 评论(3) 收藏 举报内存出错(包括 4 个). 数组越界;. 内存泄露;. 悬空指针(野指针);. 错误分配。1. 数组越界:程序反应:跳出“内存不足。” 提示框。调试的时候无法定位到准确的出错点,也就是程序崩溃的地方不确定。但是大致出错会在数组所在的函数里面或调用了数组的函数里,如果总弹出以上对话框,就检查出错代码附近是否有用到数组,特别是边界处要仔细检查。应用 vector 的时候也要注意越界问题。2. 内存泄露new 后一定要 delete,malloc 之后一定要 free。程序反应:
2、一是可能像上面一样弹出对话框提示。/一般不会出现。二是可能在 Debug 版下编译运行均不会崩溃,但是 Release 版下会导致程序崩溃,这一般是内存泄露的问题。2.1:1. delete 的时候为什么会报错?2.在哪里 delete比较合适?BOOL Test(char*& ptStr)CString temp;temp = m_pListCtrl-GetItemText(iRow, iCol);ilen = temp.GetLength()+1; /必须加 1ptStr = new charilen;strcpy(ptStr,temp); / delete ptStr;return TR
3、UE;void CallTest()char* cstemp = NULL;for( i=0;i文件中有:typedef void (*new_handler)();new_handler set_new_handler(new_handler p) throw();用户自定义:void nomorememory()std:cerr Func(); / p 是“野指针”函数 Test 在执行语句 p-Func()时,对象 a 已经消失,而 p 是指向 a的,所以 p 就成了“野指针”。但奇怪的是有些编译器运行这个程序时居然没有出错,这可能与编译器有关。4. 错误分配错误分配的管理不是很困难,
4、此类错误都会被快速地检测到。4.1 两个错误的内存释放/* Allocate once, free twice. */void f3()char *p;p = malloc(10);.free(p);.free(p);/* Allocate zero times, free once. */void f4()char *p;/* Note that p remains uninitialized here. */free(p);4.2 未初始化的指针void f2(int datum)int *p2;/* Uh-oh! No one has initialized p2. */*p2 =datum;.