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的原理
  1. 调用operator new函数申请空间。
  2. 在申请的空间上执行构造函数,完成对象的构造。
  • delete的原理
  1. 在申请的空间上执行析构函数,完成对象中资源的清理工作。
  2. 调用operator delete函数释放对象的空间。
  • new T[n]的原理
  1. 调用operator new[]函数,在operator new[]中实际调用operator new[]函数完成N个对象空间的申请。
  2. 在申请的空间上执行N次构造函数。
  • delete[]的原理
  1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
  2. 调用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命名空间声明

两种方式的区别

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/deletemalloc/free主要存在以下区别:

1.类型安全性

  • newdelete 是运算符,它们会自动调用构造函数和析构函数,因此对于类对象的内存分配和释放更为方便,同时也更加类型安全。
  • malloc和free是函数,它们只是分配和释放内存空间,并不会自动调用构造和析构函数,因此需要手动调用构造和析构函数,容易出错。

2.内存分配方式

  • newdelete 是运算符,用于动态分配和释放单个对象或对象数组的内存空间。
  • mallocfree 是函数,用于动态分配和释放指定大小的内存空间。

3.返回类型

  • new 返回的是对象指针,而 malloc 返回的是 void 类型的指针,需要进行类型转换。malloc中的(int *) (Test*)就是为了强制转换。

4.分配失败处理

  • new 在分配失败时会抛出 bad_alloc 异常,需要进行异常处理。
  • malloc 在分配失败时返回 NULL,需要手动检查返回值来处理分配失败的情况。

5.释放方式

  • 使用 new 分配的内存空间必须使用 delete 运算符来释放,对应的,使用 new[] 分配的数组内存空间必须使用 delete[] 运算符来释放。
  • 使用 malloc 分配的内存空间必须使用 free 函数来释放。
posted @   羡鱼OvO  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示