new和delete的动态分配。
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的动态分配。的更多相关文章
- 位运算+引用+const+new/delete+内联函数、函数重载、函数缺省参数
update 2014-05-17 一.位运算 应用: 1.判断某一位是否为1 2.只改变其中某一位,而保持其它位都不变 位运算操作: 1.& 按位与(双目): 将某变量中的某些位(与0位与) ...
- C++面试题汇集
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以 ...
- C++ 系列:C++ 基础 001
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- C++程序设计(一)
1. 函数指针 程序运行期间,每个函数都会占用一段连续的内存空间.而函数名就是该函数所占内存区域的起始地址(也称"入口地址").我们可以将函数的入口地址赋给一个指针变量,使该指针变 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- C++程序结构---1
C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...
- C++重要知识点小结---3
C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...
- effective c++:资源管理
对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
随机推荐
- SAP中对于获取订单的状态
在SAP中对于如何获取订单的状态,提供了至少两个函数,分别是 STATUS_READ 和 STATUS_TEXT_EDIT.下面简单介绍这两个函数 1.STATUS_READ 改函数的实现原理大 ...
- ios 适配问题
两张图解决
- MySQL注释符号
今天在执行mysql语句时很奇怪为什么没有执行,查询后发现“-- ”是mysql的注释符号,不会执行的 mysql注释符有三种: 1.#... 2."-- ",注意--后面有一个 ...
- 运用html常用标签和css定位等学做模仿百度导航页面
导航部分文字链接,鼠标触碰变颜色,除百度logo引用图片外,其它均代码编写.注释部分是一开始用的百度一下截图做的按钮,后来用div填充颜色写了一个按钮.效果图如下. HTML代码如下: <!DO ...
- Codeforces 1105D(双层广搜)
要点 题意:可以拐弯,即哈密顿距离 注意不可以直接一个一个搜,这过程中会把下一轮的标记上,导致同一轮的其它点没能正常完成应有的搜索 因此采用双层广搜,把同一轮先都出队列再的一起搜 #include & ...
- Uva11572
读入可以不需要存入数组 #include<bits/stdc++.h> #define inf 0x3f3f3f3f //const int maxn=; using namespace ...
- 《java学习三》jvm性能优化------jconsul
利用jconsul检测线程死锁, 死锁的线程,会有 已锁定 三个字 visualVm 也在jdk里 VisualVM 是一款免费的,集成了多 ...
- Bootcamp Win10蓝牙鼠标的问题
运行services.msc找到Bluetooth support service 把启动类型从手动改为自动 重新连接蓝牙鼠标
- swift 监听键盘弹出的高度
// 监听键盘通知 NotificationCenter.default.addObserver(self, selector: #selector(ComposeViewController.key ...
- HDU 3530Subsequence(单调队列)
题意 题目链接 给出$n$个数,找出最长的区间,使得区间中最大数$-$最小数 $>= m$ 且$<= k$ Sol 考虑维护两个单调队列. 一个维护$1 - i$的最大值,一个维护$1 - ...