1. #include <iostream>
    2. #include <limits>
    3. using namespace std;
    4. #define SAFE_DELETE(x) \
    5. { \
    6. if (NULL != (x)) \
    7. { \
    8. delete (x); \
    9. (x) = NULL; \
    10. } \
    11. }
    12. #define SAFE_DELETE_ARY(x) \
    13. { \
    14. if (NULL != (x)) \
    15. { \
    16. delete[] (x); \
    17. (x) = NULL; \
    18. } \
    19. }
    20. class CA
    21. {
    22. public:
    23. CA()
    24. {
    25. setter_m_iTest(-1);
    26. }
    27. ~CA() {}
    28. void setter_m_iTest(int iIn) {m_iTest = iIn;}
    29. int getter_m_iTest() {return m_iTest;}
    30. private:
    31. int m_iTest;
    32. };
    33. void fnTestClass();
    34. void clear_cin();
    35. int main(int argc, char** argv, char** envp)
    36. {
    37. fnTestClass();
    38. cout << "END, press any key to quit" << endl;
    39. clear_cin();
    40. getchar();
    41. return 0;
    42. }
    43. void fnTestClass()
    44. {
    45. int i = 0;
    46. int iTmp = 0;
    47. const int iCntAry = 4;
    48. CA* pCaAry = NULL;
    49. CA* pCa = NULL;
    50. /** new 单个对象时的内存布局
    51. +   pCa 0x00883e30
    52. 00883E30  01 00 00 00  .... ///< pCa
    53. */
    54. pCa = new CA;
    55. if (NULL != pCa)
    56. {
    57. pCa->setter_m_iTest(1);
    58. SAFE_DELETE(pCa); ///< delete后, 原来的数据变为 EE FE EE FE
    59. }
    60. /** new对象数组时的内存布局
    61. +   pCaAry  0x007d3ddc
    62. 007D3DD8  04 00 00 00  .... ; ///< 类数组元素个数 = 4
    63. 007D3DDC  00 00 00 00  .... ; ///< 类数组开始, CA[0]
    64. 007D3DE0  01 00 00 00  .... ; ///< CA[1]
    65. 007D3DE4  02 00 00 00  .... ; ///< CA[2]
    66. 007D3DE8  03 00 00 00  .... ; ///< CA[3]
    67. */
    68. pCaAry = new CA[iCntAry];
    69. if (NULL != pCaAry)
    70. {
    71. for (i = 0; i < iCntAry; i++)
    72. {
    73. pCaAry[i].setter_m_iTest(i);
    74. }
    75. }
    76. SAFE_DELETE_ARY(pCaAry);
    77. /** 手工模拟delete删除单个对象
    78. */
    79. pCa = new CA;
    80. if (NULL != pCa)
    81. {
    82. pCa->setter_m_iTest(1);
    83. if (NULL != pCa)
    84. {
    85. pCa->~CA();
    86. free(pCa); ///< ok
    87. pCa = NULL;
    88. }
    89. }
    90. /** 手工模拟delete删除对象数组
    91. 会报错, 和实际情况不同
    92. 以后再研究 :(
    93. */
    94. // 会报错, 和实际情况不同
    95. //     pCaAry = new CA[iCntAry];
    96. //     if (NULL != pCaAry)
    97. //     {
    98. //         iTmp = *((int*)pCaAry - 1);
    99. //         for (i = 0; i < iTmp; i++)
    100. //         {
    101. //             pCaAry[i].setter_m_iTest(i);
    102. //             pCaAry[i].~CA();
    103. //         }
    104. //
    105. //         free(pCaAry); ///< ! crash
    106. //         pCaAry = NULL;
    107. //     }
    108. // 会报错, 和实际情况不同
    109. //     pCaAry = new CA[iCntAry];
    110. //     if (NULL != pCaAry)
    111. //     {
    112. //         iTmp = *((int*)pCaAry - 1);
    113. //         for (i = 0; i < iTmp; i++)
    114. //         {
    115. //             pCaAry[i].setter_m_iTest(i);
    116. //             pCaAry[i].~CA();
    117. //             free(pCaAry + i); ///< ! crash
    118. //         }
    119. //
    120. //         pCaAry = NULL;
    121. //     }
    122. }
    123. void clear_cin()
    124. {
    125. cin.clear();
    126. cin.sync();
    127. }

http://blog.csdn.net/lostspeed/article/details/50300867

new对象数组时的内存布局的更多相关文章

  1. 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测

    简介: 本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解.验证和Java虚拟机中内存布局的一些推测.本文重点讲述了如何理解Class对象以及Class对象的作用. 欢迎探讨,如有 ...

  2. Java中对象创建时的内存分配

    一.前言知识铺垫   1.逃逸对象:在一个方法内创建的对象没有被外界引用则称该对象为未逃逸的对象. 2.JDK1.6以后的HotSpot虚拟机支持运行时的对象逃逸分析. 3.JVM中的参数配置: 1) ...

  3. Java对象的创建、内存布局和访问定位

    在Java运行时数据区中,我们知道了虚拟机内存的概况,本文介绍虚拟机内存中的数据的其它细节,如对象如何创建.如何布局以及如何访问. 基于实用的原则,这里以HotSpot虚拟机和常用的内存区域Java堆 ...

  4. 【深入理解JVM】:Java对象的创建、内存布局、访问定位

    对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...

  5. 【JVM第六篇--对象】对象的实例化、内存布局和访问定位

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模 ...

  6. 理解Java对象:要从内存布局及底层机制说起,话说….

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:<类和对象在JV ...

  7. java面试-对象的创建、内存布局、访问定位

    一.对象的创建 1.虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的 ...

  8. JVM详解(六)——对象的实例化、内存布局与访问定位

    一.对象的实例化 1.创建对象的方式 2.创建对象的步骤 脑图:https://www.processon.com/view/link/61701a927d9c087040525226 3.对象属性赋 ...

  9. 深入理解Java虚拟机(二)、Java对象的创建,内存布局和访问定位

    对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object

随机推荐

  1. css3.0

    css3.0相比css2.0多了些我们经常需要使用的标签属性,例如:圆角,个别圆角,不透明度,阴影特效等 1.圆角(即如何画圆)border-radius a{width:20px; height:2 ...

  2. Android中的TextView实现多行显示省略号

    今天遇到一个问题就是TextView显示内容的时候,多行显示的时候,显示省略号的问题,刚开始没有找到一个好的办法,只找到一个自定义TextView组件的方法,然而今天在贴吧中找到一个更好,更简便的方法 ...

  3. Flask web开发 处理Session

    本文我们在上篇文章<Flask web开发  处理POST请求(登录案例)>的基础上,来讲述Flask对session的支持. 在上面案例上,我们需要修改和新增如下功能 1.登录成功后的 ...

  4. docker学习笔记16:Dockerfile 指令 ADD 和 COPY介绍

    一.ADD指令 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD  源路径  目标路径 如: #test FROM ubunt ...

  5. javacoo/CowSwing 丑牛迷你采集器

    丑牛迷你采集器是一款基于Java Swing开发的专业的网络数据采集/信息挖掘处理软件,通过灵活的配置,可以很轻松迅速地从 网页上抓取结构化的文本.图片.文件等资源信息,可编辑筛选处理后选择发布到网站 ...

  6. Android 改变窗口标题栏的布局

    Android改变窗口标题栏的布局  第一种方式 --在XML文件里面引入配置文件作为标题. 第二种方式  --动态的代码加入进去. 第三种方式(网上的): 一. 重点 一般应用的Title都是建立应 ...

  7. 北京创客空间 BEIJING MAXPACE的小站

    北京创客空间 BEIJING MAXPACE的小站 北京市海淀区海淀大街1号中关村梦想实验室(原中关村国际数字设计中心)4层

  8. 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model

    CodeIgniter 框架采用MVC模式,而MVC模式中起纽带作用的就是C(控制器),在控制器的中通过加载模型获得数据,将数据传到视图中进行展示.本课将实现在控制器中加载模型. 1. 控制器的实现 ...

  9. 第一个Spark程序

    1.Java下Spark开发环境搭建(from http://www.cnblogs.com/eczhou/p/5216918.html) 1.1.jdk安装 安装oracle下的jdk,我安装的是j ...

  10. Android:创建文件或文件夹以及获取sd卡根目录

    目录结构: 功能,可以根据录入的目录或者文件夹生成相应的文件或者文件夹 首先需要添加一个权限: <uses-permission android:name="android.permi ...