首先是内存分配:
内存主要分为3个部分:
一是从静态存储区域分配。编译时分配好,主要存放全局变量,static变量,程序结束释放。
二是从堆栈区域分配。函数内局部变量存放的地方。随变量生命周期自动释放。效率较高,但大小有限。
三是从内存池分配,即从堆上分配。程序在运行时,采用new或malloc创建。必须由程序员手动调用delete和free释放。
然后是new/delete:内存泄露主要是由new和delete的不配套调用产生的
调用new的时候,会做分配空间->初始化->构造函数工作。(malloc不会调用构造函数,所以最好使用new)。
调用delete的时候,会自动调用析构函数。delete释放指针所指向空间,指针并没有被删除,最好手动设置指针为NULL。
最后,当node *a = new node(); node *b = a;可以使用delete b;来释放指针a所指向的空间。
附:
测试是否有内存泄露的方法:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
如果定义了_CRTDBG_MAP_ALLOC,打印出来的是文件名和行数等更加直观的信息。
在程序入口写几个语句:
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
程序退出时,如果发现有内存泄漏,会自动在DEBUG OUTPUT窗口和DebugView中输出内存泄漏信息