一、内存中的程序:

 在进程被载入内存中时,基本上被分成许多小的节,以下是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. solr searcher

    solr searcher 前面我配置好了solr,并且数据库建立索引也完成了. 为php添加搜索 首先下载solrphp http://wiki.apache.org/solr/SolPHP 在so ...

  2. 图解 & 深入浅出Java初始化与清理:构造器必知必会

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  3. SDL安全人员角色定义

    SDL安全人员角色定义 http://www.docin.com/p-819975580.html

  4. mshadow笔记

    矩阵维度表示和正常相反. a[2][3],行2列3,a.shape.shape_[0]=3,a.shape.shape_[1]=2. pred.Resize( Shape2( batch_size, ...

  5. Redis和Memcached的区别

    From: https://www.biaodianfu.com/redis-vs-memcached.html Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储 ...

  6. Android之TextView密码输入变星号时间

    private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...

  7. mac x Yosemide(10.10) 下安装 jdk 1.7 (jdk 1.8)的方法

    当我们想在mac x yosemide 系统中更新jdk到1.7(1.8)的时候,会弹出下面的错误提示 解决这个问题的办法如下: 1.下载 好jdk 1.7(1.8) 地址:http://www.or ...

  8. 几种在Linux下查询外网IP的办法

    原文地址:http://my.oschina.net/epstar/blog/513186 Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl ...

  9. Java中删除文件、删除目录及目录下所有文件(转)

    原文链接:Java中删除文件.删除目录及目录下所有文件 知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除,具体代码示例如下: ...

  10. cakePHP的controller回调

    1. afterFilter(), executed after all controller logic, including the rendering of the view2. beforeF ...