C与C++的内存管理
C中的malloc/relloc/calloc/free
1.malloc与free
malloc函数用于分配指定大小的内存空间,并返回空间的首地址,若分配失败则返回NULL。free用来释放已分配的内存空间。int main() { int* ptr = (int*)malloc(sizeof(int) * 10);// 分配十个 int 型的空间 if (ptr == NULL) { printf("Malloc Failure.\n"); return NULL; } free(ptr);//释放分配的空间 }2.calloc与relloc
calloc函数用于分配指定数量和大小的内存空间,并将分配的空间初始化为0。
relloc函数用于重新分配已分配的内存的大小,可以对内存进行扩大或缩小int* ptr = (int*)calloc(10, sizeof(int));// 分配十个 int 型的空间,并初始化为0 ptr = (int *)relloc(ptr, sizeof(int) * 20);//重新分配15个 int 型的空间 free(ptr);//也需要释放分配的空间注意:当使用
relloc函数重新分配内存时,若分配成功,那么原来的内存空间会被复制到新分配的内存空间,并释放原来的内存空间。因此,在使用relloc后,不再需要额外调用free函数来释放原来的内存空间,relloc函数会自动处理这个过程。
C++中new和delete
new运算符既可以分配单个对象的空间,也可以分配一个对象数组的内存空间。并且,当使用new运算符分配内存空间时,它会调用对象的构造函数来初始化成员变量。而delete会调用析构函数来完成对象中资源的清理工作。void Test() { int* ptr1 = new int;// 分配一个 int 类型的空间 int* ptr2 = new int(2);// 分配一个 int 类型的空间并初始化为2 int* ptr3 = new int[3];// 分配3个 int 类型的空间 delete ptr1; delete ptr2; delete[] ptr3; }
- new的原理
- 调用
operator new函数申请空间。- 在申请的空间上执行构造函数,完成对象的构造。
- delete的原理
- 在申请的空间上执行析构函数,完成对象中资源的清理工作。
- 调用
operator delete函数释放对象的空间。
- new T[n]的原理
- 调用
operator new[]函数,在operator new[]中实际调用operator new[]函数完成N个对象空间的申请。- 在申请的空间上执行N次构造函数。
- delete[]的原理
- 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
- 调用
operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间。
opertor new和operator delete
newdelete既然是操作符,那么就说明它们俩可以重载void* operator new (std::size_t size) throw (std::bad_alloc); void* operator delete (void* ptr) throw();
operator new申请size个字节的空间,并适当的对齐以表示该大小的任何对象,返回指向该块第一个字节的非空指针,如果失败,将会抛出一个bad_alloc异常。
operator delete释放ptr指向的内存块,释放之前通过调用operator new分配给他的存储空间,并使指针失效。
operator newoperator delete都是在全局命名空间声明,并不是在std命名空间声明
两种方式的区别
class Test { public: Test() { cout << "Constructor" << endl; } ~Test() { cout << "Destructor" << endl; } }; int main() { Test* test1 = new Test; Test* test2 = (Test*)malloc(sizeof(Test)); delete test1; free(test2); int* test3 = new int; int* test4 = (int*)malloc(sizeof(int)); delete test3; free(test4); }从以上的例子可以看出
new/delete和malloc/free主要存在以下区别:1.类型安全性
new和delete是运算符,它们会自动调用构造函数和析构函数,因此对于类对象的内存分配和释放更为方便,同时也更加类型安全。- malloc和free是函数,它们只是分配和释放内存空间,并不会自动调用构造和析构函数,因此需要手动调用构造和析构函数,容易出错。
2.内存分配方式
new和delete是运算符,用于动态分配和释放单个对象或对象数组的内存空间。malloc和free是函数,用于动态分配和释放指定大小的内存空间。3.返回类型
new返回的是对象指针,而malloc返回的是void类型的指针,需要进行类型转换。malloc中的(int *)(Test*)就是为了强制转换。4.分配失败处理
new在分配失败时会抛出bad_alloc异常,需要进行异常处理。malloc在分配失败时返回NULL,需要手动检查返回值来处理分配失败的情况。5.释放方式
- 使用
new分配的内存空间必须使用delete运算符来释放,对应的,使用new[]分配的数组内存空间必须使用delete[]运算符来释放。- 使用
malloc分配的内存空间必须使用free函数来释放。

浙公网安备 33010602011771号