|
刚才试了一下. 虽然我是一个很懒的程序员.
调试进了malloc函数, 不断Next, 来到这个函数: HeapAlloc(_crtheap, 0, size ? size : 1) , crtheap应该是CRT库自己创建的一个堆. 但是返回值是一个 _CrtMemBlockHeader 结构的指针, 查一下MSDN , 发现调试堆的概念. .
在调试进free 函数, 找到关键函数 HeapFree , 看看MSDN, 只需要传一个heap handle 与一个指针就可, 再联想几年前学的操作系统, 猜测堆应该是一个链表结构. 将指针传给操作系统的HeapFree, 则操作系统就作一个删除链表结点的动作. 证明了我上面的想法是错误的, . free(p) 无论p是什么类型, 都不影响free的结果. 本想在release版下看看内存释放里面的内容是否会被擦除, 在VC下无法调试进去 . 下载了个OllyICE的工具, 暂时还不怎么会用 . 一想到这么麻烦, 算了, 还是简单的MFC好啦.
另外在free函数有以下这句 :
if (pUserData == NULL)
return;
所以 free(NULL) 是没有问题的. 但是重复释放有效的堆内存是会引起错误的, MSDN上说: Calling HeapFree twice with the same pointer can cause heap corruption, resulting in subsequent calls to HeapAlloc returning the same pointer twice. 前面一句看懂了一点, 后面一句没怎么明白 . 总之, 在free(p)之后, 将 p = NULL 是一个好习惯. |
|