首页 > 系统相关 >C与C++的内存管理

C与C++的内存管理

时间:2024-04-21 16:13:00浏览次数:29  
标签:管理 int 内存空间 C++ 内存 operator new 分配 delete

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 函数来释放。

标签:管理,int,内存空间,C++,内存,operator,new,分配,delete
From: https://www.cnblogs.com/zhiheng-/p/18149049

相关文章

  • C++U7-1-高精度加减
    学习目标    高精度加法        [高精度加法] #include<bits/stdc++.h>usingnamespacestd;intmain(){stringa;stringb;intc[10089]={0};intd[10089]={0};inte[10089]={0};cin>>a>>b;in......
  • 《Effective C++》读书笔记
    《EffectiveC++》读书笔记之前看过一遍,不过草草了事。近日看了《深度探索C++对象模型》,想起《EffectiveC++》中的内容已经有些忘记了,所以重新温习一下。这篇笔记只挑选书中的一些重要内容进行记录。条款07:为多态基类声明virtual析构函数这一个条款几乎是面试中的高频问题,只需......
  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(二)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。接下来的几篇将会讲解非静态数据成员的存取分析,讲解静态数据成员的情况请见上一篇:《深度解读《深度探索C++对象模型》之数据成员的存取......
  • 项目配置管理
     ......
  • C++ STL -- HashTable
    HashTable一般常用的unordered_set、unordered_map都是基于哈希表实现的,哈希表主要需要注意的是哈希冲突,迭代器等基础哈希映射使用哈希函数将键映射到索引的数据结构。即将原始数组索引通过哈希函数映射到一个哈希值上,从而将一个大范围索引,减小到一个小的固定范围哈希冲突......
  • ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1)
    ASP.NETMVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1) 本系列的的角色权限管理主要采用Dotnet MVC4工程内置的权限管理模块Simplemembership实现,主要有关文件是InitializeSimpleMembershipAttribute.cs和AccountModels.cs下面是对这两个文件的了解和改造 WebSe......
  • ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6)
    ASP.NETMVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6) 快过年了,公司事情忙,好几天没有继续写博客,今天开始写账户模块系统登录,账户管理以及登录日志,首先新建登录日志数据表: ViewCode然后更改模型:AccountModels.cs ViewCode创建登录日志模型:M_UsersLoginLogs.cs View......
  • FreeLearning C/C++ 译文集翻译完成
    C++高级编程C++高级编程秘籍QtCreator应用开发C++游戏编程入门指南C++编程入门指南Boost.AsioC++网络编程BoostC++应用开发秘籍第二版C++数据结构与算法设计原理C++Qt5GUI编程C++高性能编程C++反应式编程C++系统编程秘籍C++研讨会C++现代嵌入式......
  • linux8-ssh远程管理
    1.网络配置使用nmtui命令或进入配置文件修改配置为静态1vim/etc/sysconfig/network-scripts/ifcfg-ens1602TYPE=Ethernet3PROXY_METHOD=none4BROWSER_ONLY=no5BOOTPROTO=none6DEFROUTE=yes7IPV4_FAILURE_FATAL=no8IPV6INIT=yes9IPV6_AUTOCONF=yes1......
  • js,php,C++ 压缩算法不一致
    参考:https://yushuangqi.com/blog/2015/golang-php-gzencode-difrent.html压缩的数据:这是要压缩的数据aaaaaaaaaaaaaaaaaaa2222222222222222222222222222222顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶fffffffffffffffffffgggggggggggggggggggeeeeeeeeeeeeee对应的三种语言的最后数......