new对象数组时的内存布局
- #include <iostream>
- #include <limits>
- using namespace std;
- #define SAFE_DELETE(x) \
- { \
- if (NULL != (x)) \
- { \
- delete (x); \
- (x) = NULL; \
- } \
- }
- #define SAFE_DELETE_ARY(x) \
- { \
- if (NULL != (x)) \
- { \
- delete[] (x); \
- (x) = NULL; \
- } \
- }
- class CA
- {
- public:
- CA()
- {
- setter_m_iTest(-1);
- }
- ~CA() {}
- void setter_m_iTest(int iIn) {m_iTest = iIn;}
- int getter_m_iTest() {return m_iTest;}
- private:
- int m_iTest;
- };
- void fnTestClass();
- void clear_cin();
- int main(int argc, char** argv, char** envp)
- {
- fnTestClass();
- cout << "END, press any key to quit" << endl;
- clear_cin();
- getchar();
- return 0;
- }
- void fnTestClass()
- {
- int i = 0;
- int iTmp = 0;
- const int iCntAry = 4;
- CA* pCaAry = NULL;
- CA* pCa = NULL;
- /** new 单个对象时的内存布局
- + pCa 0x00883e30
- 00883E30 01 00 00 00 .... ///< pCa
- */
- pCa = new CA;
- if (NULL != pCa)
- {
- pCa->setter_m_iTest(1);
- SAFE_DELETE(pCa); ///< delete后, 原来的数据变为 EE FE EE FE
- }
- /** new对象数组时的内存布局
- + pCaAry 0x007d3ddc
- 007D3DD8 04 00 00 00 .... ; ///< 类数组元素个数 = 4
- 007D3DDC 00 00 00 00 .... ; ///< 类数组开始, CA[0]
- 007D3DE0 01 00 00 00 .... ; ///< CA[1]
- 007D3DE4 02 00 00 00 .... ; ///< CA[2]
- 007D3DE8 03 00 00 00 .... ; ///< CA[3]
- */
- pCaAry = new CA[iCntAry];
- if (NULL != pCaAry)
- {
- for (i = 0; i < iCntAry; i++)
- {
- pCaAry[i].setter_m_iTest(i);
- }
- }
- SAFE_DELETE_ARY(pCaAry);
- /** 手工模拟delete删除单个对象
- */
- pCa = new CA;
- if (NULL != pCa)
- {
- pCa->setter_m_iTest(1);
- if (NULL != pCa)
- {
- pCa->~CA();
- free(pCa); ///< ok
- pCa = NULL;
- }
- }
- /** 手工模拟delete删除对象数组
- 会报错, 和实际情况不同
- 以后再研究 :(
- */
- // 会报错, 和实际情况不同
- // pCaAry = new CA[iCntAry];
- // if (NULL != pCaAry)
- // {
- // iTmp = *((int*)pCaAry - 1);
- // for (i = 0; i < iTmp; i++)
- // {
- // pCaAry[i].setter_m_iTest(i);
- // pCaAry[i].~CA();
- // }
- //
- // free(pCaAry); ///< ! crash
- // pCaAry = NULL;
- // }
- // 会报错, 和实际情况不同
- // pCaAry = new CA[iCntAry];
- // if (NULL != pCaAry)
- // {
- // iTmp = *((int*)pCaAry - 1);
- // for (i = 0; i < iTmp; i++)
- // {
- // pCaAry[i].setter_m_iTest(i);
- // pCaAry[i].~CA();
- // free(pCaAry + i); ///< ! crash
- // }
- //
- // pCaAry = NULL;
- // }
- }
- void clear_cin()
- {
- cin.clear();
- cin.sync();
- }
http://blog.csdn.net/lostspeed/article/details/50300867
new对象数组时的内存布局的更多相关文章
- 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测
简介: 本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解.验证和Java虚拟机中内存布局的一些推测.本文重点讲述了如何理解Class对象以及Class对象的作用. 欢迎探讨,如有 ...
- Java中对象创建时的内存分配
一.前言知识铺垫 1.逃逸对象:在一个方法内创建的对象没有被外界引用则称该对象为未逃逸的对象. 2.JDK1.6以后的HotSpot虚拟机支持运行时的对象逃逸分析. 3.JVM中的参数配置: 1) ...
- Java对象的创建、内存布局和访问定位
在Java运行时数据区中,我们知道了虚拟机内存的概况,本文介绍虚拟机内存中的数据的其它细节,如对象如何创建.如何布局以及如何访问. 基于实用的原则,这里以HotSpot虚拟机和常用的内存区域Java堆 ...
- 【深入理解JVM】:Java对象的创建、内存布局、访问定位
对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...
- 【JVM第六篇--对象】对象的实例化、内存布局和访问定位
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模 ...
- 理解Java对象:要从内存布局及底层机制说起,话说….
前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:<类和对象在JV ...
- java面试-对象的创建、内存布局、访问定位
一.对象的创建 1.虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的 ...
- JVM详解(六)——对象的实例化、内存布局与访问定位
一.对象的实例化 1.创建对象的方式 2.创建对象的步骤 脑图:https://www.processon.com/view/link/61701a927d9c087040525226 3.对象属性赋 ...
- 深入理解Java虚拟机(二)、Java对象的创建,内存布局和访问定位
对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object
随机推荐
- SICP 习题 (2.7) 解题总结 : 定义区间数据结构
SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们 ...
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...
- English learning method ---学英语重中之重打通“任督二脉”
漫漫十年艰辛路,英语学习之旅 曾经秉承“路漫漫其修远兮,吾将上下而求索”的信念,初一那年了解到原来(a b c d e f g) 不仅仅读作(啊,波,词,的,额,佛,哥),在英语的世界中它有另外的读法 ...
- Axure滚动效果实现
下面的这个透明区域用于显示滚动效果,它本身是一个处于隐藏状态的动态面板,它里面也放了一个动态面板用于产生移动的效果 里面的动态面板起名“实际内容”,注意它的默认状态是“状态2”,状态2和状态一的内容一 ...
- MSSQLServer的备份与还原
最近用到了mssql2000的数据备份还原到2008上, 在备份2000时,一定注意要备份成一个文件,就是目标那里只添加一个就好,(否则待会还原数据库时要添加这两个文件,要不就报“备份了几个簇,只提供 ...
- MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)
链接地址:http://www.minwt.com/mac/10083.html/comment-page-2 MAC» 智慧型裝罝» Android | 2014/02/12 Android是一個開 ...
- poj1584 A Round Peg in a Ground Hole 判断多边形凹凸,点到线的距离【基础计算几何】
大致思路:首先对于所给的洞的点,判断是否是凸多边形,图形的输入和输出可以是顺时针或者逆时针,而且允许多点共线 Debug 了好几个小时,发现如下问题 判断三点是否共线,可用斜率公式判断 POINT p ...
- 带符号的char类型取值范围为什么是-128——127
以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...
- mysql 从5.1升级到5.5.33 后 innodb 表出错 及 innodb表修复
服务器使用的是mysql 5.1,了解到 5.5 系列的版本 innodb 的性能有很大提升,就想升级下.按照查到的步骤: http://www.myhack58.com/Article/sort09 ...
- csu1306: Manor
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1306 解题思路:唬人的水题,只要按照他的意思打,就能过,不过,数组最好开大点.用到优先队列,也可以 ...