[转]C++中的自动存储、静态存储和动态存储

摘要:
第四种类型,线程存储,已在C++11中添加。1.函数中自动存储的正则变量使用自动存储空间,这意味着它们在调用所属函数时自动生成。当自定义函数getname()定义一个临时数组时,该临时数组仅在getname(()函数处于活动状态时存在。然后,main()中名称指针指向的内存将很快被重用。自动变量通常存储在堆栈中。

根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫做自由存储空间或堆)。在存在是间的长短方面,以这三种方式分配的数据对象各不相同。下面简要介绍这三种类型(注:C++11中新增了第四种类型——线程存储)
1.自动存储
在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。例如,挡在一个自定义的函数getname()中定义了一个temp数组时,temp数组仅当getname()函数活动时存在。当成许控制权回到main()时,temp使用的内存将自动被释放。如果getname()返回temp的地址,则main()中的name指针指向的内存将很快得到重新使用。这就是在getname()中使用new的原因之一。
实际上,自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号中的一段代码。
自动变量通常存储在栈中。这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放着些变量,着被称为后进先出(LIFO)。因此,在程序执行过程中,栈将不断地增大和缩小。
2.静态存储
静态存储是整个程序执行期间都存在的存储方式。是变量称为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用关键字statis:
static double fee = 56.50;
3.动态存储
new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,这在C++中被称为自由存储空间(free store)或堆(heap)。该内存池同用于静态变量和自动变量的内存是分开的。new和delete让您能够在一个函数中分配内存,而在另一个函数中释放它。因此,数据的声明周期不完全收程序或函数的生命时间控制。与使用常规变量相比,使用new和delete让程序员对程序如何使用内存有更大的控制权。然而,内存管理也更复杂了。在栈中,自动添加和删除机制使得占用的内存总是连续的,单new和delete的相互影响可能导致占用的自由存储区不连续,这使得跟踪新分配内存的位置更困难。

---------------------
作者:月光诗人
来源:CNBLOGS
原文:https://www.cnblogs.com/moonlightpoet/p/5647866.html
版权声明:本文为作者原创文章,转载请附上博文链接!

免责声明:文章转载自《[转]C++中的自动存储、静态存储和动态存储》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Git 多人协作开发的过程如何修改U盘的图标下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

loadrunner 打印变量

打印userid变量参数的信息 web_submit_form("ValidateLoginAction.do_2","Snapshot=t2.inf",ITEMDATA,"Name=userid", "Value={userid}", ENDITEM,"Name=pword", "Value={password}", ENDITEM,"Name=prog...

GDB高级使用方法

1、设置环境变量   用户可以在GDB的调试环境中定义自己需要的变量,用来保存一些调试程序中的运行数据。要定义一个GDB的变量很简单,只需使用GDB的set命令。   GDB的环境变量和Linux一样,也是以$起头。如:   (gdb)set $foo=xxx   使用环境变量时,GDB会在第一次使用时创建这个变量,而在以后的使用中,则直接对其赋值。...

POJO类中布尔类型的变量都不要加is前缀详解

前言 对应阿里巴巴开发手册第一章的命名风格的第八条。 【强制】 POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型Boolean isDeleted; 的属性,它的方法名称也是 isDeleted(), RPC框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到抛出异常。...

LoadRunner常用函数

1.        Intweb_reg_save_param("参数名","LB=左边界","RB=右边界",LAST);/注册函数,在参数值出现的前面使用,注册成功时返回值为0,注册失败时返回值为1。左右边界需根据TreeView里相关步骤的SeverResponse代码来确定。用以上函数能获取第一个符合条件的数值。 2.        web_reg...

使用远程线程来注入DLL

使用远程线程来注入DLL DLL注入技术要求我们目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL (1)用OpenProcess函数打开目标进程(2)用VirtualAllocEx函数在远程进程的地址空间中分派一块内存(3)用WriteProcessMemory函数把DLL的路径名复制到第一步分配的内存中(4)用GetProcAddre...

burp插件开发--基础篇

最近这几天在写burp的插件,有一些写burp插件的流程和误区想跟大家分享一下: 第一步,打开burpsuit,打开extender页面,并将burp中自带的api代码导出,方便后续的代码开发; 第二步,使用idea创建一个java项目并将上一步导出的api代码导入到该项目中; 第三步,在导入的项目中创建一个叫BurpExtender.java的类并I...