堆与栈
栈
是存在于某一作用域内的数据,在函数内声明的任何变量,其所使用的内存块都取自上述stack
堆
实在system heap,是由操作系统提供的一块global 内存空间,系统可动态分配其中的若干块,但是要
栈和堆
区别 | 堆 | 栈 |
---|---|---|
删除方式 | 需要手动删除 | 当栈返回时会自动删除 |
static 对象
起作用域结束之后仍然存在,直到整个程序结束
global 对象
在任何{} 外,直到整个程序结束之后才结束,其作用域是整个程序,视为一种static object
new和delete
使用方式
1 | String s= new Stirng("sss"); |
背后实现
- new
1
2
3
4Complex *pc;
void* mem=operator new(sizeof(Complex));//malloc(n)
pc = static_cast<Complex*>(mem);//转型
pc->Complex::Complex(1,2); - delete
1
2
3
4
5String* ps = new Sting("Hello");
delete ps;
String::~String(ps);
operator delete(ps);malloc
1
malloc(sizeof(Complex));
vc 的分配举例
通用
4Byte *2
cookie 头用于操作系统管理内存,上下各有一个所以*2
实际数据内容
Complex double 4Byte*2 两个double
debug 模式包含
- 4Byte ,共有8个头
- 4Byte ,一个用作尾
总和
debug 42+48+4+3*2 = 52
由于要求是16的倍数,要在调试信息结尾处补00,顾共占64个字节
normal 42+42 =16
array new 与 array delete
vc 还会存储数组的长度.会占用4个byte
1 | Complex* p = new Complex[3] |