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

我的家乡网页制作步骤/站长工具seo综合查询分析

我的家乡网页制作步骤,站长工具seo综合查询分析,.net 获取网站域名,品牌网站建站《linux中内存泄漏的检测(二)定制化的malloc/free》中的__wrap方法只解决了C的问题,这一节介绍怎么让C中的new/delete也能方便地插入计数代码。 wrap方法尝试 可不可以使用__wrap_new/__wrap_delete?我们试试看。 我写了这样的测试代码 #…

《linux中内存泄漏的检测(二)定制化的malloc/free》中的__wrap方法只解决了C的问题,这一节介绍怎么让C++中的new/delete也能方便地插入计数代码。

wrap方法尝试

可不可以使用__wrap_new/__wrap_delete?我们试试看。

我写了这样的测试代码

#include <iostream>
using namespace std;int count = 0;void * __wrap_new(size_t size)
{count++;return __real_new(size);
}void __wrap_delete(void *ptr)
{count--;__real_delete(ptr);
}int main()
{count = 0;int *p1 = new int;int *p2 = new int;delete p1;if(count != 0)cout<<"memory leak!"<<endl;return 0;
}

然后这样编译,g++ -o test test.cpp -Wl,--wrap,new -Wl,--wrap,delete,结果

cpptest.cpp: In functionvoid* __wrap_new(size_t)’:
cpptest.cpp:9:27: error: ‘__real_new’ was not declared in this scopereturn __real_new(size);^
cpptest.cpp: In functionvoid __wrap_delete(void*)’:
cpptest.cpp:15:22: error: ‘__real_delete’ was not declared in this scope__real_delete(ptr);^

看来这种方法不可行,这要从new和malloc的区别说起。

new VS. malloc

malloc很好理解,它的作用就是分配一段指定大小的内存空间。

而new的工作分为两步:

第一步也是分配一段指定大小的内存空间,这一步与malloc相同,它有一个专用的名字,叫operator new

第二步是将分配到的内存以指定的方式初始化化,这是malloc所没有的,它也有一个专用的名字,叫placement new

步骤作用与malloc的关系是否可以重载怎样使用
operator new分配一段指定大小的空间相当于malloc可以重载可以单独调用,如class *pA = operator new(100),相当于class *pA = malloc(100);
placement new将一段空间以指定的方式初始化malloc不能提供这样的功能不能重载可以把空间的指针作为参数传入,单独调用这一行为执行初始化操作,如class *pA = new(buf) class();,相当于使用class::class()初始化buf这段内存

关于operator new和placement new和更多细节,可以参考更多文章,但显然new的功能非常复杂,并不是一个__wrap_new(size_t size)能解决的。

operator new 重载

new的功能虽然复杂,但我们所关心的只是其中与分配内存相关的部分,也就是operator new。幸好,它可以重载。

C++支持重载,我们可以重载new中的operater new,在其中加入计数功能,并通过malloc实现内存申请。

#include <iostream>
using namespace std;#include <stdio.h>
#include <stdlib.h>int count = 0;void * operator new(size_t size)
{count++;return malloc(size);
}void operator delete(void *ptr)
{count--;free(ptr);
}int main()
{count = 0;int *p1 = new int;int *p2 = new int;delete p1;if(count != 0)cout<<"memory leak!"<<endl;return 0;
}

既然new也是通过调用malloc实现的,那么也不用operator new和malloc分别统计了,只需要统计malloc就行了。因为__wrap_symbol__real_symbol都是C函数,所有要使用extern "C"

#include <iostream>
using namespace std;#include <stdio.h>
#include <stdlib.h>int count = 0;extern "C"
{
void* __real_malloc(int c); 
void * __wrap_malloc(int size)
{count++;return __real_malloc(size);
}void __real_free(void *ptr);
void __wrap_free(void *ptr)
{count--;__real_free(ptr);
}
}void * operator new(size_t size)
{return malloc(size);
}void operator delete(void *ptr)
{free(ptr);
}int main()
{count = 0;int *p1 = new int(3);int *p2 = new int(4);cout<<*p1<<' '<<*p2<<endl;delete p1;if(count != 0)cout<<"memory leak!"<<endl;return 0;
}

分析

  • 优点

(1)使用方便 — 不需要改产品代码,只需要修改编译选项即可完成。

(2)范围全面 — wrap是个链接选项,对所有通过__wrap_malloc和__wrap_free链接到一起的文件都起作用,不论是静态库还是动态库。

(3)c的检测与c++的检测无缝兼容

  • 缺点

(1)该方法要求运行结束时对运行中产生的打印分析才能知道结果。

(2)只能检测是否泄漏,却没有具体信息,比如泄漏了多少空间

(3)不能说明是哪一行代码引起了泄漏

(4)这一方法虽然解决了C++的替换问题,却引入了新的问题。因为在C++中对于同一指针申请和释放,申请和释放的大小却有可能不相等,导致有些情况的内存泄漏检测不到。比如(a)申请子类而析构父类(b)申请数组而释放数组第一项

改进

欲知如何解决,且看下回分解

http://www.lbrq.cn/news/753553.html

相关文章:

  • 泰州网站建设服务热线/在线培训平台有哪些
  • 找人做网站属于诈骗吗/杭州网络推广公司
  • 贵阳市建设厅网站/seo基础知识包括什么
  • 网站建设与维护大学生总结/制作链接的app的软件
  • 还有河北城乡和住房建设厅网站吗/seo搜索引擎优化师
  • 教育培训网站抄袭/网络营销电子版教材
  • 十大财务软件/推推蛙贴吧优化
  • 用记事本做电影介绍的网站/seo教学视频教程
  • 引流推广营销/苏州seo关键词排名
  • 网站建设代理平台/武汉大学人民医院怎么样
  • wap网站开发自适应手机屏幕开源包/深圳百度推广代理
  • 国外网站服务器建设/上海百度关键词优化公司
  • ps做网站logo尺寸/白嫖永久服务器
  • 萧山做网站哪里找/微信指数是什么意思
  • 宝鸡网站建设排名/软件推广方案经典范文
  • 只做绿色食品的网站/买卖链接网
  • wordpress主页如何加东西/seo到底是做什么的
  • 做营销的网站推广/百度秒收录神器
  • 哪里找专业做网站的人常熟/seo系统培训课程
  • 发果怎么做视频网站/培训seo去哪家机构最好
  • 环球资源网是卖什么的/郑州官网网站推广优化公司
  • 网站建设走什么科目/百度百科推广费用
  • 小学校园门户网站建设/网站建设制作
  • 网站建设 行业资讯/百度百家自媒体平台注册
  • 手机网站制作系统/建网站平台
  • 厦门三五互联可以做网站吗/竞价托管外包费用
  • 海南网站建设网站开发/宁波网络推广平台
  • 昆山做网站找哪家好/网站出租三级域名费用
  • 北京建网站需要多少钱/百度sem推广具体做什么
  • wordpress怎么设置小图标/seo宣传
  • bash shell 入门
  • 一文读懂[特殊字符] LlamaFactory 中 Loss 曲线图
  • 2^{-53} 单位舍入误差、机器精度、舍入的最大相对误差界限
  • 4.6 Vue 3 中的模板引用 (Template Refs)
  • PyTorch生成式人工智能——使用MusicGen生成音乐
  • [Linux] Linux tar文档管理 系统间复制文档