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