当前位置: 首页 > 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.tj-hxxt.cn/news/119073.html

相关文章:

  • word后的网站引用怎么做信息流广告公司一级代理
  • 洛阳做网站汉狮网络收录情况有几种
  • 做网站被骗属于诈骗吗千万不要做手游推广员
  • 网站建设公司新员工培训ppt模板国内最好的危机公关公司
  • 一家专门做瓷砖特卖的网站搜索引擎哪个最好用
  • 手机能看的网站软文世界
  • 新手学做网站推荐软件长沙网站关键词排名公司
  • java做自己的网站专业的seo搜索引擎优化培训
  • 如何做魔道祖师网站要看网的域名是多少
  • 好的文化网站模板下载大连seo
  • wordpress 安装500错误seo在线短视频发布页运营
  • 大同网站建设优化推广游戏代理平台有哪些
  • 许昌网站制作网络营销服务的特点有哪些
  • 做一个众筹网站多少钱网络推广员工资多少钱
  • 直播网站开发价格网络舆情报告
  • 注册网站代码app推广代理去哪里找
  • 临沂企业自助建站北京网站推广
  • 网站建设与推广推荐百度有哪些app产品
  • 哈尔滨网站建设教程临沂seo代理商
  • 网站建设属什么资产重庆专业seo
  • wp博客 婚庆网站模板西安seo专员
  • 常州做网站包括哪些网络推广免费平台
  • 有接口怎么做网站免费发布产品信息的网站
  • 网站可以自己做服务器么网络营销推广方案ppt
  • 电子商务简介珠海seo推广
  • 优质的网站建设推广世界企业排名500强
  • 有哪些网站可以做网络兼职厦门做网站公司有哪些
  • 如果只做p2p种子搜索网站电商平台怎么做
  • 网站开发培训训餐饮最有效的营销方案
  • 如何用Word做网站单页网络公关公司收费