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的堆了,这个堆在函数体外面还存在,也产生了泄漏。
首先,我们知道有常量和变量。常量有个专门的内存区域存放,没有什么问题,但是变量就不一样了。
内存有堆和栈,放在栈里面的变量由系统维护,比较容易理解它的作用域和生命周期;放在堆里面的,要程序员自己来维护,也就是说不管你在哪儿申请了一个堆空间,系统都不会帮你清除,也就是作用域相当于自创建开始的全局作用域,生命周期只要你不删除,就一直存在,除非进程结束。
堆的作用我用来主要如下:
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的堆了,这个堆在函数体外面还存在,也产生了泄漏。
相关文章推荐
- C++内存管理
- C++内存管理变革(8):No Lock(无锁)的GC Allocator
- [转]C++内存管理
- C++内存管理2
- C++中的内存管理(new、delete、内存泄漏)
- C/C++内存管理机制
- C++内存管理总结系列一
- 内存管理:算法及其c/c++实现 翻译三
- C++内存管理详解
- 我与c与c++的一些感悟
- 内存管理:算法及其c/c++实现 翻译六
- C++的内存管理机制
- C++内存管理学习堆和栈-【1】
- C++内存管理
- C++内存管理变革
- C++的内存管理
- POCO C++库学习和分析 -- 内存管理 (一)
- C++内存管理变革(7)
- 谈谈 C++ 内存管理
- 【转】C++内存管理