C++利用对象的生命周期来记录离开方法的日志

14 篇文章 1 订阅

0. 前言

之前描述了利用对象生命周期来记录进入和离开关键方法日志的方法:

  1. C++中跟踪执行方法的一种简便日志记录方法
  2. C++中跟踪执行方法的一种简便日志记录方法(补充参数记录)

但是这两种方法都需要创建一个专门的类来实现功能。
如果仅仅有一处需要记录日志,那么专门创建一个这样的类明显显得不太值得。
那么,是否有办法,还是利用这种特性,创建一个简介的方式来记录离开日志?

1. 代码

这个先上代码,内容如下:

bool ClassA::funB()
{
    LOG(LL_INFO, "ClassA::funB", "Enter Function.");

    // 不关注对象本身的类型,主要是使用这个对象生命周期的特性
    QSharedPointer<int> logger 
        = QSharedPointer<int>(
            new int(0), 
            [&](int * p) {
                delete p; 
                p = nullptr;
                LOG(LL_INFO, "ClassA::funB", "Leave Function.");
    });
    // 其他代码
 }

在存在多处返回的情况下,如果函数能够正常执行完成,都能记录进入和离开日志。

2. 代码解释

既然是计划根据对象生命周期的特性,那么首先需要有一个对象。
这个对象需要有一个类,已经明确不想创建一个新的类了,那么就找一个存在的基础类型吧,这里找到了int类型,计划使用一个int类型对象的析构来完成这件事情。
那么有没有办法定制int类型对象的析构函数呢?其实是有办法的,使用共享指针的一个特殊的方法就能够定制。我这里使用的是QtQSharedPointerSTL中也有类似的方法,就不再在这里展示。

template <typename X, typename Deleter> 
QSharedPointer::QSharedPointer(X *ptr, Deleter d)

Qt文档的解释如下:

Creates a QSharedPointer that points to ptr. The pointer ptr becomes managed by this QSharedPointer and must not be passed to another QSharedPointer object or deleted outside this object.
创建一个指向 ptr 的 QSharedPointer。 指针 ptr 由此 QSharedPointer 管理,并且不得传递给另一个 QSharedPointer 对象或在此对象之外删除。
The deleter parameter d specifies the custom deleter for this object.
deleter 参数 d 指定此对象自定义的删除器。

上面的代码,也就是创建了一个指向int对象的指针,并且这个指针是由QSharedPointer类型对象logger进行管理的,在走完这个logger的生命周期后,就会调用我们自定义的析构函数,而这个时候正好是离开此函数的时候。在调用自定义的析构函数的时候,也就调用记录了相应的离开日志。
现在这个int指针指向的对象,是没有被析构的,所以需要自己定义对这个int指针的析构。

3. 扩展

同时在多线程状态复杂的情况中,可以使用此方法设置回执行的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值