`
xujinquan19
  • 浏览: 145577 次
  • 性别: 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

 全局变量

分析

结论:

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

分享到:
评论

相关推荐

    基于VB实现的商场管理系统设计(源代码+系统).zip

    【作品名称】:基于VB实现的商场管理系统设计(源代码+系统) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    数据更新至2020年主要发电企业火电机组分容量等级发电装机容量情况.xls

    数据来源:中国电力统计NJ-2021版

    数据更新至2020年电网建设 本年开工规模.xls

    数据来源:中国电力统计NJ-2021版

    基于C# WinForm框架开发的图书管理系统源码+sql文件.zip

    基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip

    毕业设计(论文)-基于Android系统的人事管理系统设计与实现(48页).doc

    毕业设计(论文)-基于Android系统的人事管理系统设计与实现(48页).doc

    pentair 5800 SXT软水机说明书

    pentair 5800 SXT软水机说明书

    (更新至2022年)各地区乡村分性别的15岁及以上文盲人口.xls

    数据来源:中国人口与就业统计NJ-2023版

    node-v12.11.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v9.6.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    (更新至2022年)全国镇分年龄、性别的人口数.xls

    数据来源:中国人口与就业统计NJ-2023版

    (更新至2022年)消费物价指数 (2019年10月-2020年9月=100).xls

    数据来源:中国人口与就业统计NJ-2023版

    node-v10.23.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.6.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v11.4.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    小区物业管理系统设计与实现.docx

    小区物业管理系统设计与实现.docx

    律师事务所办公管理系统设计及实现.doc

    律师事务所办公管理系统设计及实现.doc

    基于Qt与Android的KTV管理系统设计与实现毕业论文(25页).doc

    基于Qt与Android的KTV管理系统设计与实现毕业论文(25页).doc

    消费价格指数(2010年=100).xls

    数据来源:中国劳动统计NJ-2023版

    华为 OD 机考攻略-加强版

    附件是华为 OD 机考攻略_加强版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    node-v12.13.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics