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在释放空间前会调用析构函数完成 空间中资源的清理释放

对比总结图表

相关推荐
自在极意功。12 小时前
简单介绍SpringMVC
java·mvc·springmvc·三层架构
superman超哥12 小时前
Rust Vec的内存布局与扩容策略:动态数组的高效实现
开发语言·后端·rust·动态数组·内存布局·rust vec·扩容策略
CSDN_RTKLIB12 小时前
CMake几个命令顺序
c++
Evand J12 小时前
【MATLAB例程,附代码下载链接】基于累积概率的三维轨迹,概率计算与定位,由轨迹匹配和滤波带来高精度位置,带测试结果演示
开发语言·算法·matlab·csdn·轨迹匹配·候选轨迹·完整代码
Yuiiii__12 小时前
一次并不简单的 Spring 循环依赖排查
java·开发语言·数据库
tkevinjd12 小时前
JUC4(生产者-消费者)
java·多线程·juc
野槐12 小时前
java基础-面向对象
java·开发语言
X在敲AI代码12 小时前
LeetCode 基础刷题D2
算法·leetcode·职场和发展
sww_102612 小时前
Openfeign源码浅析
java·spring cloud
qq_3975623112 小时前
昆仑通态屏幕 , 脚本使用笔记
笔记