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

C++利用对象的生命周期来记录离开方法的日志,第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类型对象的析构函数呢?其实是有办法的,使用共享指针的一个特殊的方法就能够定制。我这里使用的是Qt的QSharedPointer,STL中也有类似的方法,就不再在这里展示。

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. 扩展

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存