首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++内存储器分配思考

2012-12-27 
C++内存分配思考引用:杨丽慧 的 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

?全局变量

分析

结论:

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

热点排行