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

梓潼县住房和城乡建设局网站网站怎么才能被百度收录

梓潼县住房和城乡建设局网站,网站怎么才能被百度收录,资兴市建设局网站,go语言可以做网站吗最近在写代码的时候,觉得每次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.hengruixuexiao.com/news/8778.html

相关文章:

  • 做相册哪个网站好今日小说搜索百度风云榜
  • 网站音频播放器源码天津百度seo推广
  • 企业网站建设验收产品市场调研怎么做
  • 郑州做网站 码通网页制作的软件有哪些
  • 网站空间是怎么开通的小广告怎么能弄干净
  • 日本做家纺的公司网站杭州seook优屏网络
  • 嘉兴做网站多少钱推广互联网推广
  • wordpress 导航函数seo营销推广公司
  • 个人备案的域名拿来做别的网站找关键词的三种方法
  • 湖北建设部网站中国有几个搜索引擎
  • 网站开发合同文档平台交易网
  • 网站要流量有什么用怎么在百度上发帖推广
  • 宠物网站制作内容昆明优化网站公司
  • 怎么做招聘网站的数据分析正规电商培训班
  • 济南手机网站开发网购平台推广方案
  • 小语种网站营销软文小短文
  • 广州哪里有网站开发搜索引擎的两个基本方法
  • 建设门户网站的请示大数据营销是什么
  • wordpress ocs优化网站快速排名软件
  • 布吉网站建设哪家公司靠谱百度网址大全怎么设为主页
  • 常德天恒建设网站seo免费优化网站
  • 电商网站设计实例推广app的软文案例
  • 西宁专业做网站seo实训报告
  • 网站规划模板惠州优化怎么做seo
  • 企业网站制作服务沈阳网站建设公司
  • 做木工的网站上海单个关键词优化
  • 建设网站需要展示什么区别合肥网站建设
  • 关于我们 网站网络优化师
  • plc编程培训机构广州seo关键词优化费用
  • 成立公司需要几个股东郑州seo优化阿亮