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
new
delete
既然是操作符,那么就说明它们俩可以重载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 new
operator delete
都是在全局命名空间声明,并不是在std
命名空间声明
两种方式的区别
标签:管理,int,内存空间,C++,内存,operator,new,分配,delete From: https://www.cnblogs.com/zhiheng-/p/18149049class 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
函数来释放。