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

C/C++内存管理感悟

2006-11-21 12:52 162 查看
大学三年级以后,几乎就没有用过C/C++了,一直简单的用着Delphi,看了点书,知道指针是什么回事,但是内存的概念其实还是一塌糊涂。

首先,我们知道有常量和变量。常量有个专门的内存区域存放,没有什么问题,但是变量就不一样了。

内存有堆和栈,放在栈里面的变量由系统维护,比较容易理解它的作用域和生命周期;放在堆里面的,要程序员自己来维护,也就是说不管你在哪儿申请了一个堆空间,系统都不会帮你清除,也就是作用域相当于自创建开始的全局作用域,生命周期只要你不删除,就一直存在,除非进程结束。

堆的作用我用来主要如下:

1.通过返回堆地址,来从函数里面传出值。

2.申请海量内存,因为一般栈空间是有限的。

new产生的内存存放与堆中,对于 int *x=new int,不要认为x的作用域相当于全局了,其实只是x指向的内存作用域相当于全局而已,x本身是存放在栈里面的。

对于字符串,开始的时候我总是弄不明白为什么用strcpy(x,y)而不是x=y,在我看来都是赋值而已。其实差别是非常大的。比如:

char *x=new char[32];

x=name.c_str();

delete[] x;

这里申请了一个堆,用x指向它,但是后面又用了x=name。记住x是一个指针,这条语句就把x指向的内存指到name上面去了,而x原来指的堆空间,就没有东西指向了,产生了内存泄漏。而后面delete[] x,删除的是x后来指向的name的地址,是一个栈地址,也就会出错。而strcpy是完全拷贝了一份,拷贝到了堆空间里面。

比如你在一个函数里面new了一个堆地址,用函数里面定义的x指向它。出了函数体以后,x就消失了,不能指向原来new的堆了,这个堆在函数体外面还存在,也产生了泄漏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: