一、内存中的程序:

 在进程被载入内存中时,基本上被分成许多小的节,以下是6个主要的节。

低地址                                                   高地址

.text 节

  .text节基本上相当于二进制可执行文件的.text部分,它包含了完成程序任务的机器指令。

  该节标记为只读,如果发生写操作,会造成 segmentation fault。

  在进程最初被加载到内存中开始,该节的大小就被固定。

.data  节

  .data节用来存储初始化过的变量

  如: int  a = 0;

  该节的大小在运行时是固定的。

.bss  节

  栈下节 (below stack section)用来存储未初始化的变量

  如: int  a;

  该节的大小在运行时是固定的。

节(空闲存储器)

  堆节(heap section)用来存储动态分配的变量,位置从低地址向高地址增长。

  内存的分配和释放通过malloc()和free()函数控制。

  栈节(stack section)用来跟踪函数调用(可能是递归),在大多数系统上从内存的高地址向低地址增长。

环境/参数

  环境/参数节(environment/ arguments section)用来存储系统环境变量的一份复制文件,进程在运行时可能需要。

  例如,运行中的进程可以通过环境变量来访问路径、shell名称、主机名等信息。该节是可写的。

  命令行参数也保存在该区域中。

二、缓冲区

  缓冲区(buffer)是指这样一个存储区域:该区域用来接收和保存数据,直至进程对数据进行处理。由于各进程都有缓冲区,

所以保持各进程缓冲区彼此无关是很重要的。通过在进程内存的 .data 和 .bss 节分配内存,可以做到这一点。

三、析构函数

  如果类没有定义自己的析构函数,编译器会生成默认的析构函数。

默认的析构函数不能删除在 堆(空闲存储器)上分配的对象和对象成员。

因此,如果成员占用的空间是在构造函数中动态分配的,就必须自定义析构函数,然后释放以前分配的内存。

使用C++智能指针,将自动删除空闲存储器中不再需要的内存。

 class CMessage
{
private:
char * m_pMessage; public:
void showIt()const
{
cout << m_pMessage << endl;
} CMessage(const char* text="Default message")
{
size_t length{strlen(text)+};
m_pMessage = new char[length+];
strcpy_s(m_pMessage,length+,text);
} ~CMessage()
{
cout << "Destructor called" << endl;
delete[]m_pMessage;
}
}; int main()
{
CMessage motto{"Amiss is as good as a mile"};
CMessage *pM{ new CMessage{"A cat can look at a queen"} }; motto.showIt();
pM->showIt(); delete pM;

return ;
}

运行结果:

      Amiss is as good as a mile
      A cat can look at a queen
      Destructor called
      Destructor called

现在注释掉: // delete pM;

运行结果:

      Amiss is as good as a mile
      A cat can look at a queen
      Destructor called

编译器为 motto 调用析构函数,是因为虽然该对象的数据成员占用的内存是由构造函数在堆上分配的,但它只是一个普通的自动对象。

而 pM 在堆上为该对象分配内存,因此必须用 delete 删除此对象。

当使用 delete 操作符删除动态创建的对象时,delete 操作符将在释放该对象占用的内存之前,首先调用该对象的析构函数。

内存分段 && 缓冲区 && 析构函数的更多相关文章

  1. Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  2. C++继承体系中的内存分段

    ---------------综述与目录-------------- 讨论这个问题之前我们先明确类的结构,一个类的大概组成,下面的很多分类名词都是我个人杜撰,为的就是让读者看懂能够区分,下面分别分类: ...

  3. 汇编语言 Part 1——简介、基本语法、内存分段与内存地址

    简介 什么是汇编语言? 汇编语言是一种低级的编程语言,在程序的语句和体系结构的机器代码指令之间有很强的对应关系. 每种汇编语言都特定于特定的计算机体系结构,但需要解释或编译.汇编语言也可以称为符号机器 ...

  4. netty内存数据缓冲区使用策略

    主要是通过AbstractByteBufAllocator类实现的ByteBuffer的申请. 代码如下: @Override public ByteBuf ioBuffer(int initialC ...

  5. 转:c++内存分配

    第一篇: http://my.oschina.net/pollybl1255/blog/140323 BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS ...

  6. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  7. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  8. 32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转)

    32位Windows7上8G内存使用感受+xp 32位下使用8G内存 博客分类: Windows XPWindowsIE企业应用软件测试  我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽 ...

  9. c++内存分配

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

随机推荐

  1. 在SpringMVC中获取request对象的几种方式

    1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...

  2. c#上iOS apns p12文件制作记录

    1.在桌面上建一个"apns_p12"文件夹,所有的保存和生成文件都放在这里 2.从钥匙串中生成CertificateSigningRequest.certSigningReque ...

  3. iOS工程集成支付宝错误Undefined symbols for architecture armv7

    问题描述: 新工程中需要集成支付宝功能,于是咱就把支付宝的库给集成了进入然后就出现了下面这种错误了说,错误信息如下: Undefined symbols for architecture armv7: ...

  4. Hadoop 2.4.1 Map/Reduce小结【原创】

    看了下MapReduce的例子.再看了下Mapper和Reducer源码,理清了参数的意义,就o了. public class Mapper<KEYIN, VALUEIN, KEYOUT, VA ...

  5. 14款让前端开发者心动的jQuery/CSS3插件及源码

    14款让前端开发者心动的jQuery/CSS3插件及源码,一起来看看. 1.jQuery左右滚动banner代码! DEMO演示    /    源码下载 2.jQuery QQ表情插件qqFace ...

  6. Spring Boot 之 RESRful API 权限控制

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “简单,踏实~ 读书写字放屁” 一.为何用RESTful API 1.1 RESTful是什么? ...

  7. wordpress表结构

    WordPress仅仅用了10 个表:wp_comments, wp_links, wp_options, wp_postmeta, wp_posts, wp_term_relationships, ...

  8. SQL Server 2008 R2 开启数据库远程连接

    今天要测试一个.net系统~因为配置的数据库是SQL Server~我就不得不安装SQL Server 2008 R2~现在我们就一起来看看SQL Server 2008 R2是如何打开远程连接端口1 ...

  9. SharePoint 2013中以其他用户身份登录的WebPart(免费下载)

    在SharePoint 2013中微软并没有提供在SharePoint 2010中以其他用户身份登录的菜单,这对一般用户影响不大,但对于系统管理员或测试人员或特定人员(如在OA系统中的文员或秘书,常常 ...

  10. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...