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

校园网站建设与应用友情链接的方式如何选择

校园网站建设与应用,友情链接的方式如何选择,网站策划书包括哪些内容?,天津餐饮网站建设最近在写代码的时候,觉得每次new出来的对象都需要去delete好麻烦,于是直接把delete写到了析构函数中,在析构函数里面写了句delete this,结果调用析构函数的时候死循环了,不是很理解原因,于是去研究了一下。…

  最近在写代码的时候,觉得每次new出来的对象都需要去delete好麻烦,于是直接把delete写到了析构函数中,在析构函数里面写了句delete this,结果调用析构函数的时候死循环了,不是很理解原因,于是去研究了一下。

情景复现

代码

#include <iostream>
#include <string>
using namespace std;
class Book
{
private:int id_;
public:Book(int id) :id_(id){}~Book(){cout << "调用析构函数" << endl;delete this;}
};
int main()
{Book* book1 = new Book(111);book1->~Book();return 0;
}

结果:死循环然后报错
在这里插入图片描述

new和delete的实现原理

(1).对于内置类型
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:
new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

(2).对于自定义类型

  • new的原理
    1 调用operator new函数申请空间
    2 在申请的空间上执行构造函数,完成对象的构造
    3 成功的话返回一个指针,失败抛出异常
  • delete的原理
    1 在空间上执行析构函数,完成对象中资源的清理工作
    2 调用operator delete函数释放对象的空间
  • new T[N]的原理
    1 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对
    象空间的申请
    2 在申请的空间上执行N次构造函数
    3 成功的话返回一个指针,失败抛出异常
  • delete[]的原理
    1 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
    2 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释
    放空间

operator new和operator delete的原理

看了下源码

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,
尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{//try to allocate size bytesvoid *p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){//report no memory//如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK); /* block other threads */__TRY/* get a pointer to memory block header */pHead = pHdr(pUserData);/* verify block type */_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK); /* release other threads */__END_TRY_FINALLYreturn;
}
/*
free的实现
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

  operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,(尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请)否则抛异常。(为什么要封装malloc?为了符合C++里面出问题抛异常这样的一种机制)
  operator delete: 该函数最终是通过free来释放空间的(delete会自动判断指针是否为空指针,如果是空指针则delete不执行任何操作)
  从使用的角度看,和malloc,free没有区别,区别就是operator new delete失败的时候会抛异常。

  因此我们在使用new关键字的时候,可以使用try catch包裹起来对申请空间失败进行处理

try
{int *p = new int[10000000000];
}
catch (bad_alloc &e)
{cout << e.what() << endl;cout << "ok" << endl;
}

重载operator new与operator delete

operator new和operator = 等其他符号一样可以被重载,如果重载了,new的时候就会调用我们重载的那个operator new。
这样有什么好处呢?

  1. 如果我们的类需要频繁调用new,则直接通过new底层的malloc向堆中申请资源,速度就会比较慢,我们可以为当前类实现一个定长的内存池,然后在我们自己的operator new里面不通过malloc申请了,而是通过自己的内存池申请空间,这样就能提高效率。
  2. 如果我们需要在对当前类使用new和delete的时候打印一些日志信息,就可以使用operator new来重载

结论

  delete会先调用对象指针的析构函数,然后再调用国operator delete释放内存,如果没有重载operator delete,默认底层调用的是free。如果在析构函数内部调用delete,delete又会调用析构函数,于是产生死循环。

http://www.khdw.cn/news/55859.html

相关文章:

  • 做资料分享网站百度seo优化软件
  • 推荐的网站百度推广竞价托管
  • 网站布局如何修改网络推广培训班
  • 网站开发 .net怎么去优化关键词
  • wordpress php 5.3.x重庆seo点击工具
  • 做网站的公司哪家最好淘宝关键词搜索
  • java开发 大型网站开发陕西网络推广公司
  • 新网站前期seo怎么做网络营销专业就业前景
  • 可以上传资源的网站开发费用网站搭建需要多少钱
  • 网站设计的标准希爱力的功效及副作用
  • 电子商务网站建设有什么意义手机app免费制作平台
  • 花都建网站公司seo工程师是做什么的
  • 电脑商业网站怎的做seo优化运营
  • 程序员做游戏还是做网站好郑州百度网站优化排名
  • 沼气服务网站建设管理友情链接交换形式有哪些
  • 郑州网站建设排行榜青岛网站建设微动力
  • 网站在线咨询系统百度广告管家
  • 安阳做网站的地方搜索引擎优化教程
  • 请专业公司做个网站要花多少钱2022年新闻热点摘抄
  • wordpress文字颜色怎样修改seo网络营销技巧
  • 制造网站建设哪家好手机网站制作
  • 网络优化论文灰色词优化培训
  • 长沙市seo排名点击器
  • 怎样做好竞价推广上海seo外包公司
  • 南山网站制作联系电话新河seo怎么做整站排名
  • 免费全能网站空间江苏泰州seo网络优化推广
  • 可以做问答的网站seo怎么去优化
  • 网站建立之间不安全如何解决网络营销是什么专业类别
  • 成都网站网页制作seo查询seo优化
  • 商城网站项目案例常州seo排名收费