【c++】堆栈内存管理

堆栈内存管理

变量作用域

class complex{}...// 声明一个复数类

// 作用域
{
	complex c1(1,2); // 局部变量,存储在当前作用域的栈里
	complex *p = new complex(3);// p指向的地址在堆中不会自动销毁
	static complex c2(2,3);// static object 一直到整个程序结束才会销毁
	delete p;// 手动回收指针
}

complex c3(3,4);// 全局变量

new关键字的操作

new:
1.先分配足够内存
2.调用该对象的构造函数

complex *p = new complex(1,2);
<==>
void *mem = operator new(sizeof(complex));// 分配内存 operator new会调用malloc(n)
p = static_cast<complex*>(mem);// 转换类型 把void*转成complex*
p->Complex::Complex(1,2);// 调用构造函数

delete关键字的操作

delete:
1.先调用该对象的析构函数
2.释放内存

delete p;
<==>
String::~String(p);// 调用析构函数
operator delte(p);// 释放内存 operator delete内部调用free(p)

(vc编译器)调试模式下的内存管理:

(vc编译器)调试模式下的内存管理

8byte(object size)+32byte(debug header)+4byte(debug tail)+4byte(cookie header)+4byte(cookie tail) = 52byte +12byte(padding)= 64 byte

【cookie内容】:00000041 = 16进制64 00000040+ 00000001(表示程序使用中,最后一个bit用来标识状态,所以内存大小必须是16的倍数)

当这块内存释放后变成00000040,表示这块64byte的内存已经回收

(vc编译器)发布模式下的内存管理:

(vc编译器)发布模式下的内存管理

8byte(object size)+4byte(cookie header)+4byte(cookie tail) = 16byte

【cookie内容】:00000011 = 16进制16 00000010+ 00000001(表示程序使用中)

new[] (array new)动态分配所得的数组

// array new 一定要搭配array delete(如果对象没有指针,array delete能用但是不合理)

string *p = new string[3];
delete[] p;// 正确

string *p = new string[3];
delete p;// 错误 p[1]和p[2]字符串的内存因为没有调用析构函数而没有释放

(vc编译器)调试模式下的数组内存管理

(vc编译器)调试模式下的数组内存管理

8byte(object size)*3 + 32byte(debug header) + 4byte (debug tail) + 4byte (cookie header)+ 4byte(cookie tail) + 4byte(array size) = 72 byte + 8byte(padding) = 80byte

(vc编译器)发布模式下的数组内存管理

同理

posted @ 2021-02-20 15:30  kudo_shini  阅读(124)  评论(0编辑  收藏  举报