您的位置:首页 > 编程语言 > C语言/C++

高质量C++第七章内存管理学习笔记

2013-01-19 20:35 381 查看
第七章 内存管理

内存分配方式三种:

1.从静态存储区分配,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。如:全局变量,static变量。

2.在栈上创建,执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运 算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3.从堆上分配,也叫动态内存分配。

指针与数组的对比:

数组要么在静态存储区被创建,要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期保持不变,只有数组的内容可以改变。

指针可以随时的指向任意类型的内存块,他的特征是“可变”,所以我们常用指针来操作动态内存。

计算内存容量:

char a[] = "hello world"; //sizeof(a)为12(别忘了‘\0’)

char *p = a; //sizeof(p)为4,因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。

当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

void Func(char a[100])

{

cout<<sizeof(a)<<endl; //4字节而不是100字节

}

指针参数是如何传递内存的?

如果函数的参数是一个指针,不要指望该指针去申请动态内存。非要用指针参数去申请内存,那么应该改用指向指针的指针。还可以用函数返回值来传递动内存,但是注意不要用return语句返回指向"栈内存"的指针。

编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p,如果函数体内的程序修改了_p的内容,就导致参数p的内容作出相应的修改,这就是指针可以用作输出参数的原因。

通常有三种方式处理“内存耗尽”问题:

1.判断指针是否为NULL,如果是则马上用return语句终止函数

2.判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行

3.为new和malloc设置异常处理函数

对于32位以上的应用程序而言,无论怎样使用malloc与new,几乎不可能导致“内存耗尽”。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间代替。

本文出自 “破虏的冬天” 博客,请务必保留此出处http://chenpolu.blog.51cto.com/4292751/1122408
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: