CC++内存管理

mac2025-08-30  13

C / C++中程序内存区域划分

1.内核空间(用户代码 不能读写) 2.栈 (非静态局部变量/函数参数/返回值等等) 向下增长 3.内存映射段(文件映射 动态库 匿名映射) 4.堆 (用于程序运行时动态内存分配) 向上增长 5.数据段 ----储存全局数据和静态数据 5.代码段 ----可执行的代码 / 只读常量

C语言中动态内存管理方式
malloc / calloc / realloc / free
void Text() { int* p1 = (int*)malloc(sizeof(int)); free(p1); int* p2 = (int*)calloc(1, sizeof(int)); int* p3 = (int*)realloc(p2, sizeof(int) * 1); //p3 将 p2 的内存大小改变了 ,并且两个指向一个地址 }
C++内存管理方式

通过 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会调用析构函数

malloc / free和 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 }
最新回复(0)