C++ 4:内存管理

c语言的内存管理与c++的内存管理是通用的

C语言的内存管理

malloc: 从堆区分配一块连续的内存 void* malloc (size_t size)

realloc: 函数用于重新分配内存 void* realloc (void* ptr, size_t size)

calloc: 在申请空间后,对空间逐一进行初始化,并设置值为0; void* calloc (size_t num, size_t size)

free:释放动态开辟的空间 free (void* ptr)

C++内存管理

c的内存管理在C++也适用,但有些部分并不行,所以C++有自己的内存管理方式:

通过new和delete操作符进行动态管理

new/delete****操作内置类型

cpp 复制代码
void Test() 
{ 
    // 动态申请一个int类型的空间
     int* ptr4 = new int; 
    // 动态申请一个int类型的空间并初始化为10 
    int* ptr5 = new int(10);
     // 动态申请10个int类型的空间 
    int* ptr6 = new int[3]; 
    delete ptr4; 
    delete ptr5;
     delete[] ptr6;
 }

newdelete****操作自定义类型

cpp 复制代码
#include <iostream>
using namespace std;
class A {
public:
	A(int a , int b )
		:_a(a)
		,_b(b)
	{ 
		cout << "A()" << endl;
	}
	A(const A& aa)
	{
		cout << "const A& aa" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
	int _b;
};
int main()
{
	//A* p1 = new A(1);
	//A* p2 = new A(2);
	//A* p3 = new A(*p1);
	//delete p1;
	//delete p2;
	//delete p3;
	
	//实现多个参数new,且是全缺参函数
	//三种方法:
	//1  有名实现
	//2 匿名实现
	//3 隐形转换
	A aa1(1, 1);
	A aa2(2, 2);
	A aa3(3, 3);
	//都是先构造三次,再析构三次
	// 1
	A* p1 = new A[3]{aa1,aa2,aa3};
	// 2
	A* p2 = new A[3]{ A(1, 1), A(2, 2), A(3, 3) };
	//3
	A* p3 = new A[3]{ {1,1,},{2,2},{3,3} };
	delete []p1;
	delete []p2;
	delete []p3;
	return 0;
}

注意事项

1.使用要注意类型搭配,如new 与 delete使用

2 禁止对一块空间进行多次释放

3.c语言中的malloc realloc这些是函数 而C++中的new delete是操作符

4.在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc
free****不会

operator newoperator delete****函数

newdelete是用户进行动态内.存申请和释放的操作符operator newoperator delete
系统提供的全局函数new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

cpp 复制代码
operator new:

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) {
  //......
}

operator delete: 该函数最终是通过free来释放空间的
{
    //......
}

 free的实现

#define free(p) _free_dbg(p, _NORMAL_BLOCK)

malloc/freenew/delete****的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。

不同的地 方是:

  1. malloc和free是函数,new和delete是操作符

  2. malloc申请的空间不会初始化,new可以初始化

  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,\[\]中指定对象个数即可

  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成 空间中资源的清理释放

对比总结图表

相关推荐
王老师青少年编程5 小时前
2025年【江苏“信息与未来”编程思维】真题及题解(T2:坐标变换)
c++·题解·真题·坐标变换·编程思维·江苏·信息与未来
折哥的程序人生 · 物流技术专研6 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
千寻xun6 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
researcher-Jiang6 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
CS创新实验室7 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
似是燕归来7 小时前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发
西门吹-禅8 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_8 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
skywalk81638 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ19878 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php