1.内核空间(用户代码 不能读写) 2.栈 (非静态局部变量/函数参数/返回值等等) 向下增长 3.内存映射段(文件映射 动态库 匿名映射) 4.堆 (用于程序运行时动态内存分配) 向上增长 5.数据段 ----储存全局数据和静态数据 5.代码段 ----可执行的代码 / 只读常量
通过 new 和 delete 操作符进行动态内存管理
void Text() { //动态申请一个int类型的空间 int* p1 = new int; //动态申请一个int类型的空间并初始化为10 int* p2 = new int(10); //动态申请10个int类型的空间 int* p3 = new int[10]; delete p1; delete p2; delete[] p3; }在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数
1.malloc / free是函数,new / delete是操作符 2.malloc申请空间不会初始化,new可以初始化 3. malloc申请空间时,需要手动计算空间大小并传递,new只用在后面跟上空间类型 4.malloc 返回值为void*,在使用时必须强转, new不需要 5.malloc 申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,new需要异常捕获 6.申请自定义类型对象时,malloc / free只会开辟空间 , 不会调用构造函数和析构函数 . new会调用构造函数,delete会调用析构函数
设计一个类,只能在堆上创建对象 要控制所有的从栈上创建的可能
拷贝构造 / 赋值构造禁止 构造函数私有化要调用new class HeapOnly { public: static HeapOnly* Creat() { return new HeapOnly; } private: HeapOnly() {} //只声明 不实现 HeapOnly(const HeapOnly&); bool operator=(const HeapOnly& d); };设计一个类,只能在栈上创建对象 只要将 new屏蔽掉就好了
class StackOnly { public: StackOnly() {} private: void* operator new(size_t size); //个人觉得不需要对delete进行重载,因为没有new }