博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中创建一个对象
阅读量:5905 次
发布时间:2019-06-19

本文共 1627 字,大约阅读时间需要 5 分钟。

刚看完了侯捷的《stl源码剖析》,很不错的一本书,打算对着vc的stl源码来验证一下。 而所有的C++对象第一步就是创建,我看了一下new中得代码,大概做个记录吧。理解的不深,纯做记录而已。

class CA {
public: CA(void); ~CA(void); //void* operator new (size_t size); };
CA::CA(void) {
} CA::~CA(void) {
} //void* CA::operator new (size_t size) //{
// return malloc(size); // //}

这个类中我注掉的代码就是重载了该类的new 运算符的实现, 去掉注销的代码是直接可以运行的。 测试用的main函数如下:

#include "A.h" int main() {
CA* a = new CA(); }

当编辑器在编译这个CA* a = new CA();语句时, 会先去调用new函数,如过类中没有自己定义的new函数,会去调用在<new>中得实现,该实现中是使用malloc来分配内存的,有一些异常处理的代码。在调用完new分配好内存后,就调用 CA类的构造函数来对数据进行初始化。这个流程在《深入浅出C++对象模型》中有讲的,刚翻了一下这本书。通过汇编代码,也可以验证这个流程

CA* a = new CA(); 004114ED  push        1           // 因为 CA为空,所以传递给new的size是1 004114EF  call        operator new (4111EAh)   //调用new函数 004114F4  add         esp,4       004114F7  mov         dword ptr [ebp-0E0h],eax 004114FD  mov         dword ptr [ebp-4],0 00411504  cmp         dword ptr [ebp-0E0h],0 0041150B  je          main+70h (411520h)          //如果内存非配不成功,跳转 0041150D  mov         ecx,dword ptr [ebp-0E0h]    00411513  call        CA::CA (411014h)              //内存分配好了, 然后调用 构造函数来 初始化对象 00411518  mov         dword ptr [ebp-0F4h],eax      // 将结果(指针值)放到一个内存里 0041151E  jmp         main+7Ah (41152Ah) 00411520  mov         dword ptr [ebp-0F4h],0         //将 指针a 赋 0 值,表示分配未成功 0041152A  mov          eax,dword ptr [ebp-0F4h]     //eax是 new CA(); 的返回值

这个流程比较简单清晰,但是以前不知道的。 当时在看哪个《深入浅出C++对象模型》时,看了, 也忘了, 所以觉得有必要记录一下。

有了new的基础,以后再好好看看VC中stl的源码的其他部分吧。 刚还捎带看了一眼malloc的代码,系统内部维护了一个列表

_CrtMemBlockHeader * pHead;

这个结构没有看到定义,但是在运行时是可以看见的, 用vs看。 

转载于:https://www.cnblogs.com/kwliu/archive/2011/12/27/2303582.html

你可能感兴趣的文章
20个非常有用的Java代码片段
查看>>
转 ubuntu解压命令全览
查看>>
Android开发的前景分析——之你为何看好Android?
查看>>
linux学习笔记
查看>>
页面自动刷新
查看>>
No free lunch in search and optimization
查看>>
分析 Spring 的编程式事务管理及声明式事务管理(转)
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>
mongoDB(1):windows下安装mongoDB(解压缩版)
查看>>
CentOS修改主机名
查看>>
php 5.3.6中php-fpm 配置
查看>>
XMPP协议分析-原理篇
查看>>
centos7常用操作
查看>>
Sysprep工具封装系统
查看>>
系统集成资质培训 - 新书发布
查看>>
Ubuntu解决RTNETLINK answers: File exists
查看>>
ES6数组去重的最佳实践:Set结合Array.from() | 拓展运算符结合 Set
查看>>
深入屏幕像素概念
查看>>
awk命令的几个选项注释
查看>>