按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
使用new和delete代替malloc和free可以从类库提供的增强的内存管
理调试支持中得到好处,这在检测内存漏损时非常之有用。而当你使
用MFC的发行版本 (Release version)来创建应用程序时,MFC的发行
版本并没有使用这种改良版本的new和delete操作符,取而代之的是
一种更为有效的分配和释放内存的方法。
与帧分配不同,在堆上可分配的对象所占用的内存的总量只受限于系
统可有的所有虚拟内存空间。
以下的示例代码对比了上面讨论的内存分配方法在为数组、数据结构
和对象分配内存时的用法:
…………………………………………………………Page 149……………………………………………………………
使用帧分配为数组分配内存:
{
const int BUFF_SIZE = 128;
// 在帧上分配数组空间
char myCharArray'BUFF_SIZE';
int myIntArray'BUFF_SIZE';
// 所分配的空间在超出作用域时自动回收
}
使用堆分配为数组分配内存:
const int BUFF_SIZE = 128;
// 在堆上分配数组空间
char* myCharArray = new char'BUFF_SIZE';
int* myIntArray = new int'BUFF_SIZE';
。。。
delete '' myCharArray;
delete '' myIntArray;
使用帧分配为结构分配内存:
struct MyStructType { int topScore;};
void SomeFunc(void)
{
// 帧分配
MyStructType myStruct;
// 使用该结构
myStruct。topScore = 297;
// 在超出作用域时结构所占用的内存被自动回收
}
…………………………………………………………Page 150……………………………………………………………
使用堆分配为结构分配内存:
// 堆分配
MyStructType* myStruct = new MyStructType;
// 通过指针使用该结构
myStruct…》topScore = 297;
delete myStruct;
使用帧分配为对象分配内存:
{
CMyClass myClass; // 构造函数被自动调用
myClass。SomeMemberFunction(); // 使用该对象
}
使用堆分配为对象分配内存:
// 自动调用构造函数
CMyClass *myClass=new CMyClass;
myClass…》SomeMemberFunction(); // 使用该对象
delete myClass; // 在使用delete的过程中调用析构函数
l 注意:
l 一定要记住一个事实,在堆上分配的内存一定要记得释放,对于
使用运算符new分配的内存,应当使用delete运算符来释放;而使
用malloc函数分配的内存应当使用free函数来释放。不应 当对同
一内存块交叉使用运算符new、delete和函数malloc、free (即使
用delete运算符释放由malloc函数分配的内存,或使用free函数
释放由new运算符根本的 内存),否则在MFC的调试版本下将会导致
内存冲突。
对固定大小的内存块,使用运算符new和delete要比使用标准C库函数
malloc和free方便。但有时候我们需要使用可变大小的内存块,这
时,我们必须使用标准的C库函数malloc、realloc和free。下面的示
例代码创建了一个可变大小的数组:
…………………………………………………………Page 151……………………………………………………………
#include
#include
#define UPPER_BOUND 128
void main()
{
int *iArray=(int *)malloc(sizeof(int));
for (int i=0;i