当前位置: 首页 > news >正文

C++内存管理的理解

malloc、calloc、realloc 区别

void Test (){int* p1 = (int*) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?int* p2 = (int*)calloc(4, sizeof (int));int* p3 = (int*)realloc(p2, sizeof(int)*10);// 这里需要free(p2)吗?//这里不需要free(p2),//因为我们在realloc的时候,如果修改了原本的空间地址,会自动进行释放free(p3 );}//malloc不会对开辟的空间赋初始值
//calloc会对开辟的空间赋初始值
//realloc是对空间大小进行修改

new/delete 和 malloc/free 的区别

主要是针对自定义类型,我们的 C++主要是对类进行操作,也就是自定义类型。

我们的 new 和 delete 会调用相应的构造函数和析构函数

malloc 和 free 不会调用相应的构造函数和析构函数


class A
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}private:int _a;
};
int main()
{// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数A *p1 = (A *)malloc(sizeof(A));A *p2 = new A(1);free(p1);delete p2;// 内置类型是几乎是一样的int *p3 = (int *)malloc(sizeof(int)); // Cint *p4 = new int;free(p3);delete p4;A *p5 = (A *)malloc(sizeof(A) * 10);A *p6 = new A[10];free(p5);delete[] p6;return 0;
}

operator new 和 operator delete 函数

这两个是实现两个运算符(new 和 delete) 的具体函数,也就是带特殊名称的具体函数

其在实现时是对 malloc 和 free 的封装

两者在调用相应的函数时会进行检测,等遇到空间申请和释放失败的时候会进行抛异常处理,同时也会在空间申请之后调用构造函数,在空间释放之前调用析构函数

// operator new  ---------------------------------------------------------
void * __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void *p;while ((p = malloc(size)) == 0)          // 先尝试 mallocif (_callnewh(size) == 0)            // 调用用户安装的 new-handler{static const std::bad_alloc nomem;_RAISE(nomem);                   // 无 handler 可调用,抛异常}return p;
}// operator delete  ------------------------------------------------------
void operator delete(void *pUserData) noexcept
{if (pUserData == nullptr)return;_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData);             // 取得块头_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg(pUserData, pHead->nBlockUse); // 最终用 _free_dbg → free__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLY
}

new/malloc/delete/free 混用的危害

当我们使用 new 进行自定义数据的数组申请时,如果自定义数据中含有析构函数,则会多申请 4 字节的内存空间来记录相应的数组数据个数 在释放时,会进行相应次数的析构函数调用。

我们在 delete[] 时,会自动便宜释放地址,释放那对申请的 4 字节空间避免内存泄露

http://www.dtcms.com/a/511904.html

相关文章:

  • 当EtherCAT遇上PROFINET:我们的“协议小翻译”让矿井安全手拉手
  • 【完整源码+数据集+部署教程】【制造业&盒子】食品物品检测系统源码&数据集全套:改进yolo11-MultiSEAMHead
  • 在windows学习Kubernetes的几个障碍
  • MySQL数据库管理、DDL、DQL、DML、DCL等总结
  • Telink BLE SDK软件架构
  • 计算机毕设java医院挂号系统 基于Java的医院智能挂号与信息管理系统 Java医院挂号及医疗信息综合平台
  • 上海市500强企业名单单页面优化
  • 【0443】signalfd + epoll 完成事件监听+指定信号处理(演示demo)
  • 湛江有没有做网站的算卦网站哪里可以做
  • 布局具身智能时代(上):深兰科技“具身视觉导航大脑”技术的商业化探索
  • test002
  • RTPENGINE redis 测试
  • 在Ubuntu中安装Docker
  • 佛山市专注网站建设平台网站制作二级网页怎么做
  • 百度收录情况查询南通seo公司网站
  • 【MySQL】慢查寻的发现和解决优化(思维导图版)
  • gbase8s之.net8连接8s之mysql模式(windows)demo
  • 【AI】大模型之深度估计
  • 7.1 EXTI工作原理
  • LazyLLM教程 | 第11讲:性能优化指南:从冷启动到响应加速你的RAG
  • windows后渗透中常用的信息收集命令
  • 初始化node项目express,项目结构介绍
  • Optuna - 自动调参利器python实例
  • 新网站做优化要准备什么合肥网站建设哪个公司做得比较好
  • 提供服务好的网站制作网站怎么做会员系统
  • 绍兴网站建设推广宁夏建设管理局网站
  • 【面向小白】git rebase全面总结,什么时候用rebase
  • Kubernates的部署(从安装到实践)
  • C++ 11
  • (一)Flutter 插件项目demo预览图