- 利用malloc()函数分配得到的一个内存空间,在使用free()释放内存后,相当于把申明得到的变量与这块内存之间的联系消除了,但是这个变量其中仍然存储着这块内存的地址,并且仍然可以利用这个free()后的变量去读写这块内存中的内容,但是此时这种操作是违法的,此时这个指针就是一个野指针。
网上看过一种说法很有意思:你利用malloc函数在heap中申请了一段内存,就相当于你租了一个房子,此时你可以在房子内布置自己的东西;过了一段时间之后,你退房了。但是之后你仍然去这个房子取走或放置东西,就是违法的。
所以为了避免这种情况的误用,可以在每次free(point)之后,“初始化”一次这个指针,即:
Type *p=(Type *)malloc(sizeof(Type));
...
free(p);
p=NULL;
- malloc后在没有free之前不要随意更改地址,否则最后无法释放变成野指针,就会造成内存泄漏(memory leak)
- 内存泄露的危害:
内存泄露就是系统回收不了那些分配出去但是又不使用的内存, 随着程序的运行,可以使用的内存就会越来越少,机子就会越来越卡,直到内存数据溢出,然后程序就会挂掉,再跟着操作系统也可能无响应. 接着你就按重启了。 - VS中检测内存泄漏的方法:
Step 1:确定错误位置的index;
#include <crtdbg.h>
int main()
{
//your code
...
//
_CrtDumpMemoryLeaks();
return 0;
}
会在程序输出有如下提示信息:
index就图中标红的地方;
Step 2:
#include <crtdbg.h>
int main()
{
_CrtSetBreakAlloc(index);
//your code
...
//
_CrtDumpMemoryLeaks();
return 0;
}
- 关于多层自定义的数据结构:
例如:
struct hashtable
{
hashelemnt *hashead;
…
}
struct hashelement
{
Node *list_head;
Node *list_tail;
}
struct node
{
int *prev;
int *next;
}
这种情况,malloc应该有三层,free也得有三层!因为比如一个链表的数据结构是由这个链表的头节点和尾节点构成,在free()时,我先把这个链表中的所有节点遍历一遍并都free(),但是这并不代表着就可以不用再free()这个链表数据结构,因为实际上malloc这个链表时,内存的大小实际上是指向两个节点的指针内存大小,而我free()每一个节点实际上free()的是前面free()的指针指向的实际内容。