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;
}
new和delete****操作自定义类型
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 new与operator delete****函数
new和delete是用户进行动态内.存申请和释放的操作符,operator new和operator 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/free和new/delete****的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。
不同的地 方是:
-
malloc和free是函数,new和delete是操作符
-
malloc申请的空间不会初始化,new可以初始化
-
malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可
-
malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
-
malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
-
申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成 空间中资源的清理释放
对比总结图表
