一、内存中的程序:

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

    一. Log4net是什么.优点 用来记录程序日志,优点:1.提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug:2.日志信息可以输出到不同的地方(数据库,文件,邮箱等). 二. L ...

  2. 国内 Composer 镜像收集

    本文转载自: https://www.insp.top/article/composer-mirror-image 常见的: { "repositories": [ {" ...

  3. [转载]CSS教程:实例讲解定位Position

    http://www.missyuan.com/thread-395406-1-1.html 1. position:static 所有元素的默认定位都是:position:static,这意味着元素 ...

  4. repo andrid

    http://www.cnblogs.com/bluestorm/p/4419135.html

  5. 安卓开发笔记——Fragment+ViewPager组件(高仿微信界面)

    什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再 ...

  6. WebKit内核分析之Page

    参考地址:http://blog.csdn.net/dlmu2001/article/details/6213377 注:本系列博客是在原博主博客基础上增加了自己的理解和片段,可以看源博文获得清晰的结 ...

  7. VPN有什么用?(转载)

    VPN有什么用?转载自:http://www.chinaz.com/web/2012/0320/240819.shtml 当你非常非常想访问一个国外的网站,而这个网站被防火墙屏蔽的时候,你应该怎么做呢 ...

  8. Ping-Pong (Easy Version)(DFS)

    B. Ping-Pong (Easy Version) time limit per test 2 seconds memory limit per test 256 megabytes input ...

  9. 【cs229-Lecture17】离散与维数灾难

    主要内容: 解决MDP问题的算法: 离散化: 模型MDP的同化型: (model/similator) 拟合值迭代算法: Q函数: 近似政策迭代: 笔记转自:http://blog.csdn.net/ ...

  10. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...