C++中内存分配、函数调用和返回值问题
来源:互联网 发布:淘宝旺旺号是会员名吗 编辑:程序博客网 时间:2024/05/16 11:26
在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题
以下是各个区的作用:
(1)代码区:存放程序代码;
(2)数据区
a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,存放在这个区的数据在程序全部执行结束后系统自动释放,生命周期贯穿于整个程序执行过程。
b.动态数据区:包括堆区和栈区
堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就会造成内存泄露的问题,导致后面一直无法访问这片存储区域。
栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。
注意:1)全局变量以及静态变量存放在静态数据区;
2)注意常量的存放区域,通常情况下,常量存放在程序区(程序区是只读的,因此任何修改常量的行为都是非法的),而不是数据区。有的系统,也将部分常量分配到静态数据区,比如字符串常量(有的系统也将其分配在程序区)。但是要记住一点,常量所在的内存空间都是受系统保护的,不能修改。对常量空间的修改将造成访问内存出错,一般系统都会提示。常量的生命周期一直到程序执行结束为止。
在弄懂内存分配的问题过后,来看看函数调用的过程:
执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则类外),继续进入到函数体内部,如果遇到变量,则按情况为变量在不同的存储区域分配空间(如果是static类型的变量,则是在进行编译的过程中已经就分配了空间),函数内的语句执行完后,如果函数没有返回值,则直接返回调用该函数的地方(即执行远点),如果存在返回值,则先将返回值进行拷贝传回,再返回执行远点,函数全部执行完毕后,进行退栈操作,将刚才函数内部在栈上申请的内存空间释放掉。
理解一个指针传参的例子:
#include<iostream>using namespace std;void test(int *p){int b=2;p=&b;cout<<"Test Function call ing **********"<<endl;cout<<"&p == "<<&p<<endl;cout<<"p == "<<p<<endl<<endl;}int _tmain(int argc, _TCHAR* argv[]){int a = 10;int *p = &a;cout<<"Before test Function call"<<endl;cout<<"&p == "<<&p<<endl;cout<<"p == "<<p<<endl<<endl;test(p);cout<<"After test Function call"<<endl;cout<<"&p == "<<&p<<endl;cout<<"p == "<<p<<endl<<endl;return 0;}运行结果:
结论:
当指针作为参数进行传递时传递的也只是一个值,只不过该值只一个地址,因此对于形参的改变并不影响实参。
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- 浅谈C/C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- [转]浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题
- 清除VS最近项目的历史记录
- C++STL简介
- Hadoop动态添加删除datanode及tasktracker
- 去除 listview gridview 滑到底的 阴影
- 新手配置 Jetty + Eclipse (Hot code debugging)
- C++中内存分配、函数调用和返回值问题
- NYOJ 499 迷宫
- C++继承方式
- STL中的优先队列知识
- 浅析NSDI'2013上的两篇和memcached相关的论文
- 我的第一个C#程序
- Win7下的异形窗体——SetLayeredWindowAttributes()的应用注意
- hdu 1863 prime 畅通工程
- JAVA的Iterator