dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
关于变量与内存分配的学习认识
来源:bc-cn 作者:中学者


    变量和内存的问题,原来是自己理解,通过写小代码来验证,但是总感觉有什么地方不对,使我很混乱,所以今天就在网上看了一些文章,然后重新认识了这个问题。下面算是我的认识,如果有不对的地方,请指出,多多交流................ 我是新手!!!

    C++中内存的分配:
    1.栈:是用来存放像一般变量和函数参数等的一块内存。系统会在变量生存期结束时自动释放内存,即把内存从栈中弹出。 
    2.堆:用来存放动态变量,如指针。要通过设计者自己管理变量,自行进行创建和清理工作。(利用new和delete) 
    3.自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 
    4.全局/静态存储区:全局变量和静态变量被分配到同一块内存。 
    5.常量存储区:用来存储常量,即不能被修改的变量。
­
    以上是内存分区的问题,下面是我理解的问题: 
    1.变量声明与定义: 
    声明只是告诉编译器有这么一个变量,而定义在声明的同时便进行内存分配。
//------1.cpp--------------

#include
using namespace std;
extern int n;//声明变量n,只告诉有这么一个名字
void function(int a){....};//定义形参a,并分配内存
int main(){ 
    int i; //定义变量i,并分配内存 
    return 0;
}

    其中,对于函数function,形参a的生存期在函数体内,在函数结束工作后,a便被释放,从栈中弹出。(a所占的内存和内存地址现在没有变量使用了),来看下面的代码;

#include
using namespace std;
int *p=NULL;
void fun(int a){ p=&a;}
int main(){
    int n=10;
    fun(n); 
    cout<    return 0;
}

    代码执行的结果是显示a的内存地址,然而在原来的我理解是a仍然占着这块内存区域,但是其实不是的,a早已被弹出栈,所以这块区域是空着的。之所以会这样,是因为指针p是全局的,p存放了a的地址,p的生存期没有结束,所以仍指向这块地址,所以会显示a的原来的内存地址。
­
    由此,我就理解了传值返回和引用返回,为什么引用返回不能返回局部变量。第一,引用返回返回的是实际地址,即可用的。第二,如果返回局部变量,那么局部变量结束生存期被释放后,那块内存就空着了,没有变量用,所以不能操作........如果用传值返回返回局部变量却是可行的,因为传值返回在执行renturn 语句的时候要进行拷贝,把即将释放的局部变量的值拷贝到临时变量上。。
­
    再来就是对于new和delete:
//-----------------------------2.cpp--------

#include
using namespace std;
int main(){ 
    int *p=new int(4);//p存储在栈中,动态分配得到的内存存在堆中,从而通过指针指向一个无名字的堆来进行相关的操作....... 
    ................ 
    ........... 
    delete p;//释放p,p还是指向原处,因为p没被释放,被释放的是无名字的堆内存区块!! 
    return 0;
}

­
­
    所以,我就理解认为,其实在编写代码时用到的变量,只不过是给底层的内存区域提供一个名字,然后间接地操作内存的内容...................

 

 

上一篇:C++计算四则表达式的模板   下一篇:C++中的内存划分
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·C++计算四则表达式的模板
·C++中的内存划分
·C&C++论战之C++真的还有未来吗?
·数据库在C++程序中使用方法
·瘦身前后——兼谈C++语言进化
·大数的阶乘算法
·《C++0x漫谈》系列之:右值引用
·井字游戏(C++版)终级版
·缓冲区溢出原理浅析以及防护
·c/c++中指针学习的两个绝好例子
·C++ builder 的文件读
·使用CreateProcess()函数
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763