当前位置: 首页 > 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.hkea.cn/news/42039/

相关文章:

  • 嘉祥网站建设广东省自然资源厅
  • 忘记网站后台密码网站排名软件推荐
  • 怎么查公司网站有没有被收录火爆产品的推广文案
  • 绵阳网站建设 经开区网络教学平台
  • wordpress阅读量没改7个湖北seo网站推广策略
  • 网站建设成功案例方案找培训机构的平台
  • 园林绿化网站建设百度关键词优化公司
  • 个人如何建设网站网络营销方式有哪些分类
  • 北京做百度网站建设电商平台如何推广运营
  • 电脑个人网站怎么做网络销售新手入门
  • 海口网站建设 小黄网络手机百度搜索
  • 太原百度网站建设网站应该如何进行优化
  • 烟台市做网站uc浏览网页版进入
  • 工程信息网站哪家做的较好提高工作效率心得体会
  • 建站平台入口徐州网站设计
  • 出口手工艺品网站建设方案站长统计app下载
  • 提升学历骗局武汉搜索引擎排名优化
  • wordpress+park主题上海全国关键词排名优化
  • 潍坊最早做网站的公司短链接生成网址
  • 东莞化工网站建设爱站网ip反域名查询
  • 做网站赚钱 2017哈尔滨关键词排名工具
  • 建设的网站首页微信怎么做推广
  • 建设网站导航百度信息流推广和搜索推广
  • 深圳室内设计公司招聘信息流广告优化
  • 旅游网站首页四种营销模式
  • 负责网站建设如何在百度发广告推广
  • 联通的网站是谁做的营销的主要目的有哪些
  • 衡阳微信网站地推的方法和技巧
  • 南阳做网站公司哪家好自动发外链工具
  • 潍坊网站制作最低价格网络营销案例有哪些