c++对象模型 视频的实际操作

 note:

1.虚函数有虚指针,所以是4,不管有几个虚函数,

都只有一个vptr来存放调用的虚函数的地址。

2.子类的内存是父类内存的加自己的数据内存。

3.class类型的动态数组的初始化调用类的默认构造函数。

4.sizeof(Foo[5])=5*sizeof(Foo) array前面多了一个count,编译器才知道要调几个构造和析构。

// test4.cpp : 定义控制台应用程序的入口点。
// #include <iostream>
using namespace std; class Foo
{
public:
int id;//4
long data;//4
string str;//32 public:
Foo():id(0)
{
cout<<"default ctor.this="<<this<<",id="<<this->id<<endl;
}
Foo(int i):id(i)
{
cout<<"ctor.this="<<this<<",id="<<id<<endl;
} //virtual
~Foo() {cout<<"dtor.this="<<this<<",id="<<id<<endl;} static void* operator new(size_t size);
static void operator delete(void* phead,size_t size);
static void* operator new[](size_t size);
static void operator delete[](void* phead,size_t size);
}; void* Foo::operator new(size_t size){//size=40
Foo* p=(Foo*)malloc(size);
cout<<"Foo::operator new(size_t size) "<<size<<endl;
return p;
} void Foo::operator delete(void* phead,size_t size){
cout<<"Foo::operator delete(void* phead,size_t size)) "<<phead<<","<<size<<endl;
free(phead);
} void* Foo::operator new[](size_t size){
Foo* p=(Foo*)malloc(size);
cout<<"Foo::operator new[](size_t size) "<<size<<endl;//size=40*5+4=204,4字节用来存放指针,指针里的内容是数组的长度
return p;
} void Foo::operator delete[](void* phead,size_t size){
cout<<"Foo::operator delete[](void* phead,size_t size)) "<<phead<<","<<size<<endl;
free(phead);
} int main()
{ cout<<sizeof(Foo)<<endl;//40
Foo* p=new Foo(7);// 先operator new(sizeof(Foo))分配40个字节,再调构造函数
cout<<endl;
delete p;//先调初始化为7的析构函数,再调operator delete(p,sizeof(Foo))释放40个字节
cout<<endl;
//cout<<sizeof(Foo[])<<endl; //非法
cout<<sizeof(Foo[5])<<endl; //40*5=200
Foo* pArray=new Foo[5]; // 先operator new(sizeof(Foo[5])+sizeof(Foo*))分配204个字节, 再调5个默认构造函数
cout<<endl;
delete[] pArray;//先调最后一个构造的数组元素,最后释放存放Foo的指针,size=40
cout<<endl;
cout<<endl; //////////////::new Foo(7)全局动态分配 跳过前面的重载
//Foo* p=::new Foo(7);//“p”: 重定义;多次初始化
Foo* p2=::new Foo(7);
cout<<endl;
::delete p;
cout<<endl;
//Foo* pArray=::new Foo[5]; // “pArray”: 重定义;多次初始化
Foo* pArray2=::new Foo[5];
cout<<endl;
::delete[] pArray; system("pause");
return 0;
}

输出

new和delete的动态分配。的更多相关文章

  1. 位运算+引用+const+new/delete+内联函数、函数重载、函数缺省参数

    update 2014-05-17 一.位运算 应用: 1.判断某一位是否为1 2.只改变其中某一位,而保持其它位都不变 位运算操作: 1.& 按位与(双目): 将某变量中的某些位(与0位与) ...

  2. C++面试题汇集

    1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以 ...

  3. C++ 系列:C++ 基础 001

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  4. C++程序设计(一)

    1. 函数指针 程序运行期间,每个函数都会占用一段连续的内存空间.而函数名就是该函数所占内存区域的起始地址(也称"入口地址").我们可以将函数的入口地址赋给一个指针变量,使该指针变 ...

  5. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  6. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  7. C++重要知识点小结---3

    C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...

  8. effective c++:资源管理

    对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call ...

  9. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

随机推荐

  1. 剑指Offer的学习笔记(C#篇)-- 二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 一 . 解题思路 新颖的解法,使得该题目运用到了二进制的位运算符.先了解一下位运算符! 此题便很好的发挥了位运算符& ...

  2. Spring @Import 注解

    @Import  导入某个bean 文件 @Configuration @Import({User.class,MyImportSelector.class,MyImportBeanDefinitio ...

  3. luogu P2731 骑马修栅栏 Riding the Fences

    入度为奇数的点,搜他. 最好邻接矩阵... #include<cstdio> #include<iostream> #define R register int using n ...

  4. 前端JavaScript(1) --Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏

    一.Javascript简介 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) Jav ...

  5. Canada Cup 2016 C. Hidden Word 构造模拟题

    http://codeforces.com/contest/725/problem/C Each English letter occurs at least once in s. 注意到题目有这样一 ...

  6. 【转】 Oracle 中的一些重要V$ 动态性能视图,系统视图和表

    v$database:数据库的信息,如数据库名,创建时间等. v$instance 实例信息,如实例名,启动时间. v$parameter 参数信息,select * from v$parameter ...

  7. SpringMVC注解方式与文件上传

    目录: springmvc的注解方式 文件上传(上传图片,并显示) 一.注解 在类前面加上@Controller 表示该类是一个控制器在方法handleRequest 前面加上 @RequestMap ...

  8. spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...

  9. js浮点数计算(加,减)

    最近工作中经常遇到需要处理浮点型计算的问题,开始一直都在用把浮点数先乘以10的对应小数的位数的次方化成整数再去开始计算. 例如100.01+100.02,可以化成(100.01*100+100.02* ...

  10. zblog忘记后台密码怎么办 官方解决方案

    刚装的zblog还没开始研究,结果发现密码弄错了进不去后台,也是醉了 为节省时间,直接用官方方案,就是一个无密码进后台的文件.下载后把文件上传至网站根目录,然后直接访问后台修改密码 zblog密码找回 ...