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

对比总结图表

相关推荐
The Last.H8 小时前
Codeforces Round 1069 (Div. 2)
算法
LYFlied8 小时前
【每日算法】LeetCode 76. 最小覆盖子串
数据结构·算法·leetcode·面试·职场和发展
没有bug.的程序员8 小时前
微服务的本质:不是拆服务,而是拆复杂度
java·jvm·spring·微服务·云原生·容器·架构
LXS_3578 小时前
Day17 C++提高 之 类模板案例
开发语言·c++·笔记·算法·学习方法
leo__5208 小时前
基于MATLAB实现的鲁棒性音频数字水印系统
开发语言·matlab·音视频
2301_789015628 小时前
C++:多态(面向对象的主要手段之一)
c语言·开发语言·c++·多态
小年糕是糕手8 小时前
【C++】string类(一)
linux·开发语言·数据结构·c++·算法·leetcode·改行学it
初願致夕霞8 小时前
LeetCode双指针题型总结
算法·leetcode·职场和发展
努力学算法的蒟蒻8 小时前
day36(12.17)——leetcode面试经典150
算法·leetcode·面试