`
xujinquan19
  • 浏览: 145298 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C++内存分配思考

    博客分类:
  • C++
阅读更多

引用:杨丽慧 的 C++内存分配的五种方法

    也不知道是不是她,当初我拷贝这篇文章时没注意作者是谁,现在需要引用,特意找了一下,如果不对,请指正。

正文:

    在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

    自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

    全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

验证程序:

测试:
#include <iostream>
using namespace std;
const int abc =125;
const int abcd = 125;
int abc1 = 12;
int abc2 = 12;

void text(int **p1,int **p2)
{
 int a =1;
 int b =1;
 cout<<"stack text:"<<&a<<"  "<<&b<<endl;

 static int a1 = 1;
 static int b1 = 1;
 cout<<"static text:"<<&a1<<"  "<<&b1<<endl;

 char* cp1="sadfsafasfasdf";
 char* cp2="sadfsafasfasdf";
 cout<<"const test:"<<(int)cp1<<" "<<(int)cp2<<endl;

 *p1 = new int;
 *p2 = new int;
}

int main()
{
 int *p1,*p2;
 text(&p1,&p2);

 int a =1;
 int b =1;
 cout<<"stack main:"<<&a<<"  "<<&b<<endl;

 static int a1 = 1;
 static int b1 = 1;
 cout<<"static main:"<<&a1<<"  "<<&b1<<endl;

 char* cp1="sadfsafasfasdf";
 char* cp2="sadfsafasfasdf";
 cout<<"const main:"<<(int)cp1<<"  "<<(int)cp2<<endl;

 int *p3 = new int;
 int *p4 = new int;
 cout<<"heap text:"<<p1<<"  "<<p2<<endl;
 cout<<"help main:"<<p3<<"  "<<p4<<endl;


 cout<<"const:"<<&(abc)<<" "<<&abcd<<endl;
 cout<<"Global"<<&abc1<<"  "<<&abc2<<endl;


 delete p1;
 delete p2;
 delete p3;
 delete p4;
 return 0;
}
结果:
stack text:0xbfac1c7c  0xbfac1c78
static text:0x804a04c  0x804a050
const test:134516012 134516012
stack main:0xbfac1cb4  0xbfac1cb0
static main:0x804a044  0x804a048
const main:134516012  134516012
heap text:0x89a5008  0x89a5018
help main:0x89a5028  0x89a5038
const:0x8048d94 0x8048d98
Global0x804a03c  0x804a040

分析:仁者见仁,智者见智(欢迎讨论)

问题1:需要4B,堆给我分配了16B?

问题2:静态变量存储如何实现?

问题3: const int 算不算常量?

内存何时释放问题:

栈:
#include <iostream>
using namespace std;

char* text()
{
 char a[] ="fadsfasf";
 return a;
}

int main()
{
 char *p=text();
 cout<<p<<endl;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
??3?
fadsfasf
success

静态变量
#include <iostream>
using namespace std;

char* text()
{
 static char a[] ="fadsfasf";
 return a;
}

int main()
{
 char *p=text();
 cout<<p<<endl;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
fadsfasf
fadsfasf
success

堆:
#include"string.h"
#include <iostream>
using namespace std;
char* text()
{
 char* p = new char[8];
 strcpy(p,"fadsfasf");
 return p;
}
int main()
{
 char *p=text();
 cout<<p<<endl;
 delete []p;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
fadsfasf
fadsfasf
success

常量区
#include"string.h"
#include <iostream>
using namespace std;

char* text()
{
 return ("fadsfasf");
}

int main()
{
 char *p=text();
 cout<<p<<endl;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
fadsfasf
fadsfasf
success

 全局变量

分析

结论:

    好像只有栈在函数返回时释放,全局区,静态区,常量区,堆都不释放....

分享到:
评论

相关推荐

    C语言内存分布图(计算机基础知识)

     全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。  常量存储区,这是一块比较特殊的...

    内存管理内存管理内存管理

    程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...

    c语言内存思考

    对c语言内存的操作,可以清晰地认识c语言条件下计算机内存的分配

    操作系统(内存管理)

    因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个...

    Go语言的内存模型及堆的分配管理

    Go这门语言抛弃了C/C++中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为...

    浅谈CC++内存泄漏及其检测工具

    浅谈C/C++内存泄漏及其检测工具2006-04-03 09:00 作者: 出处: 温馨小屋 责任编辑:&gt;方舟 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart...

    开学了,有路网团购太便宜啦! C++编程惯用法(高级程序员常用方法和技巧)/深入C++系列(C++ Strategies and Tactics)

    9.12 动态内存分配中的瓶颈 9.13 内嵌 9.14 Tiemann法则 9.15 小结 9.16 问题 第10章 异常 10.1 一个负面的声明 10.2 为什么需要异常? 10.3 一个异常的例子 10.4 异常只应该用来表述异常情况 10.5 理解异常 10.6 ...

    最新名企标准通用C++面试题,

    栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 3. 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。...

    C++大学教程,一本适合初学者的入门教材(part2)

    18.10 动态内存分配:函数calloc和realloc 18.11 无条件转移:goto语句 18.12 联合体 18.13 连接指定 小结 术语 自测练习 自测练习答案 练习 第19章 string类与字符串流处理 19.1 简介 19.2 string的赋值与...

    C++大学教程,一本适合初学者的入门教材(part1)

    18.10 动态内存分配:函数calloc和realloc 18.11 无条件转移:goto语句 18.12 联合体 18.13 连接指定 小结 术语 自测练习 自测练习答案 练习 第19章 string类与字符串流处理 19.1 简介 19.2 string的赋值与...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    探究C++中string类的实现原理以及扩展使用

    C++程序员编码过程中经常会使用string(wstring)类,你是否思考过它的内部实现细节。比如这个类的迭代器是如何实现的?对象占多少字节的内存空间?内部有没有虚函数?内存是如何分配的?构造和析构的成本有多大?笔者...

    操作系统,作业调度,进程调度,存储管理的实验

    在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB •作业2申请60KB •作业3申请100KB •作业2释放60KB •作业4申请200KB •...

    C++大学教程

    1.17 内存的概念-------------------------------------------------------18 1.18 算术运算---------------------------------------------------------19 1.19 判断:相等与关系运算------------------------...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    10.2.4 为内存分配加上一个壳 302 10.3 RELEASE版本的调试 310 10.4 小结 311 第11章 脚本 313 11.1 为什么需要脚本 314 11.2 应该用脚本做些什么 316 11.3 脚本不应该做什么 318 11.4 如何嵌入脚本语言 319 11.5 ...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    10.2.4 为内存分配加上一个壳 302 10.3 RELEASE版本的调试 310 10.4 小结 311 第11章 脚本 313 11.1 为什么需要脚本 314 11.2 应该用脚本做些什么 316 11.3 脚本不应该做什么 318 11.4 如何嵌入脚本语言 319 11.5 ...

    Fourinone分布式计算框架

    FourInOne(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我也看了老外写的其他开源框架,也对分布式计算进行了长时间的思考,当我们把复杂的hadoop当作一门学科学习时,似乎忘记了我们想...

    Arena分配器,DTOR和嵌入式预分配缓冲区

    像内存管理这样的竞技场,在竞技场中嵌入分配,DTOR,上下文思考

    传智播客扫地僧视频讲义源码

    17_结构体做函数内存分配指针 18_结构中套一级指针 19_结构体中套二级指针_传智扫地僧 20_作业强化 21_C提高课程_day01-day04_知识体系梳理_传智扫地僧 源码及文档 01_上次课程回顾 02_二级指针三种内存模型综合训练...

    在一小时内学会 C#(txt版本)

    除了内存分配的不同外,类和结构就和 C++ 中的情况一样。类的对象在堆中分配,并使用 new 关键字创建。而结构是在栈(stack)中进行分配。C# 中的结构属于轻量级快速数据类型。当需要大型数据类型时,你应该创建类。...

Global site tag (gtag.js) - Google Analytics