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
随机推荐
- 【转】Android数字证书
Android数字证书的作用是非常重要的.Android操作系统每一个应用程序的安装都需要经过这一数字证书的签名. Android手机操作系统作为一款比较流行的开源系统在手机领域占据着举足轻重的地位. ...
- 用 PS 调整服务器时间
用 PS 调整服务器时间 Powershell 有一个命令用来调整计算机的时间, Set-Date -Adjust,但是,只能调整本地时间,不能调整远程的计算机时间. function AdjustD ...
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
- js词法作用域
作用域链和原型链是JS中比较重要的2个概念, JS的是函数作用域,与C之类语言的块级作用域不同 JS的作用域还是词法作用域,或者叫静态作用域,作用域链是在语法解析时就完成的,而不是在执行时创建. 例子 ...
- oschina开源硬件其它开源,开源硬件
硬件驱动/工具 25Linux内核 101桌面环境 40开源字体 58嵌入式操作系统 33输入法 110开源硬件 57开源图书 5开源家居 17物联网 87开源货币/比特币 32NASA 开源项目 1 ...
- 快的打车 技术部 在 杭州 招聘 #年前面试 年后入职#架构师 - 内推网(neitui.me)
快的打车 技术部 在 杭州 招聘 #年前面试 年后入职#架构师 - 内推网(neitui.me) 陈丹 (cd**@kuaidadi.com) 01-18 发布了内推 #年前面试 年后入职#架构师 • ...
- Effective C++ Item 40 明智而审慎地使用多重继承
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:多重继承比单一继承复杂.它可能导致新的歧义性,以及对 virtual 继承的须要 演示 ...
- NDK如何调试系统核心动态库(无系统源码的情况)
版权归薛定諤耗子所有,转载请表明出处. 1,有源码,需要导入符号表 2,没有源码,如何调试 1)运行ndk-gdb:../../ndk-gdb --verbose --launch=com.examp ...
- 2008r2 做windows域控制器
新配一个: 1.装DNS服务. 2.装domain管理. config domain: 客户端172.16.1.34 ping zyctest
- saltstack:使用教程之二高级模块用法Grains、Pillar
1.grains用法: 在客户端服务启动的时候收集客户的基础信息,在配置发生变化后也可以通过master重新同步 显示一个客户端的所有项目: [root@node5 ~]# salt "no ...