您尚未登录。

楼主 # 2022-02-06 18:47:17

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

简便地追踪C++中任意类对象的复制,移动和析构

对象生命周期管理是C++里最麻烦的事之一,虽然在C++11引入智能指针之后资源的回收变得简单了很多,但并不是所有时候我们都想把对象丢到堆上;除了对象的析构以外,我们也还有其他希望知道的事,比如在预期对象会被移动的地方是否真的发生了移动(而不是拷贝),或者一些编译器能把拷贝优化掉(e.g. RVO)的地方,是否真的发生了优化。对于我们自己定义的类,可以通过给构造函数、析构函数加个断点或者打印来追踪对象的生命周期,但是对于依赖库的类,尤其是标准库容器,这种侵入式的做法就没那么容易实施了。我最近想到了一个小trick可以跟踪任意类对象的生命周期:利用C++里被继承的类也可以被模板化的特性,写一个定义了构造函数和析构函数的装饰器类,这样被装饰器包装的类型可以直接替代原来的类型,同时用户可以给构造函数和析构函数附加自定义的行为。一个小demo展示一下效果:
HKkhp8.md.png

我把这个过程抽象成了一个header-only的小工具,代码可以在这里下载到:
https://github.com/SdtElectronics/ACI/tree/master/Logoo

用法:比如希望追踪std::string实例的生命周期,只用把原来的std::string换成Logoo<std::string>:

// std::string str{"a"};
Logoo<std::string> str{"a"};

更多细节可以参考上面的链接,仓库里面提供了两个例子,也可以参考我写的这篇博客,里面详细讲述了这个工具是怎么被静态装饰器实现的,以及怎么自定义装饰器的行为:
Track Lifetime of Objects in C++

离线

#1 2022-02-18 18:01:14

jlau
会员
注册时间: 2018-06-11
已发帖子: 198
积分: 190.5

Re: 简便地追踪C++中任意类对象的复制,移动和析构

666!真希望gcc,clang这些编译器直接提供这些功能

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn