我想在方法中使用unique_ptr 我想依靠一个事实, 那就是在方法的最后括号中将其销毁 (如果确实如此)

我想依靠这个事实的原因是我想编写一个简单的日志记录类,该类指出何时输入/退出了方法,例如:

class MethodTracing
{
    string _signature;

    public:
        MethodTracing(string signature)
        {
            _signature=signature;
            BOOST_LOG_TRIVIAL(trace) << "ENTERED " << _signature ;
        }

        ~MethodTracing()
        {
            BOOST_LOG_TRIVIAL(trace) << "EXITED " << _signature;
        }
};

然后,我可以像这样使用它:

void myMethod( )
{
    auto _ = unique_ptr<MethodTracing>(new MethodTracing(__FUNCSIG__) ) ;
    /// ... 
}

在方法中创建一个unique_ptr时,在该方法的末尾销毁(假设它没有被传递)是真的(并且是一致的)吗?

还有其他我应该注意的隐藏(或其他!)陷阱吗?

更新:正如大多数答案所建议的,我本可以使用局部变量作用域。 我用MethodTracing(__FUNCSIG__); ,但是,当然,我没有分配局部变量! 因此它立即超出了范围。 我以为运行时很聪明,但是不,那是我愚蠢(在C#中太长了!)

===============>>#1 票数:3

您不需要这样做-依靠自动存储,例如

void myMethod( )
{
  MethodTracing __sig(__FUNCSIG__);

  // do stuff
}

__sig将在函数作用域的末尾自动销毁

(是__sig是错误的格式,如果需要,可以__sig其他名称)

===============>>#2 票数:2

您通常可以依靠它。 例外是显式调用terminate()代码。 通常,对象的析构函数超出范围时将被调用(对于局部变量,这是方法的结尾)。 这是RAII的基础。

===============>>#3 票数:2 已采纳

是的,unique_ptr在创建范围的末尾被销毁。但是,您不需要unique_ptr即可获得此功能,因为所有C ++类都具有此功能。 您最好直接创建MethodTracing对象:

void myMethod( )
{
    MethodTracing _(__FUNCSIG__);
    /// ... 
}

===============>>#4 票数:1

是的,那是真的。 但不一定是控制流经右括号。 可能是由于返回,异常或跳转到其块之外。

但是,在调用exit()终止程序时应格外小心。 像您独特的ptr这样的本地自动装置将不会被销毁。

===============>>#5 票数:1

如果您的~MethodTracing析构函数比上面描述的更为复杂, ~MethodTracing确保它不会抛出~MethodTracing ,否则您的类可能只会被部分破坏。

就我个人而言,我只是如上所述在栈上声明它。

  ask by Steve Dunn translate from so

未解决问题?本站智能推荐:

1回复

Logging Guard限制半恒定日志消息

我在应用程序中使用boost log进行日志记录。 但是,在我的代码的某些部分中,如果出现问题,我会经常出现一些日志语句。 我想要某种保护措施,当它检测到同一日志消息不断出现时,可以限制日志消息。 例如(这是一个简化的示例,不是实际的实现) 如果由于某种原因“ frameb
4回复

在记录错误时取消引用ptr是错误的设计吗?

在浏览一些我没有写的旧代码时,我注意到这样的事情(简体) 所以我想尝试将其更改为 因为如果ptr是垃圾,我担心在登录之前就崩溃了? 我在这个例子中是严厉的吗? 通常,在记录错误时也应避免取消引用。 编辑:关于MYLOGGER,它是一个以此结尾的宏:具有重载运算符<
1回复

设置boost :: log严重性过滤器以调用函数,而不是使用恒定的严重性

我创建了一个使用boost :: log的Logger类。 该类跟踪当前设置的严重性级别。 在向接收器添加严重性过滤器时,我希望过滤器根据当前的严重性进行过滤,而不是在添加接收器时进行过滤。 在添加过滤器时,如下所示,仅在设置过滤器时才调用currentSeverityLevel()
1回复

Boost Log范围日志/属性未显示

我正在尝试将Boost Log用于我的日志记录框架,但遇到一些问题。 我的严重性记录器工作正常。 但是,我想做的是在日志消息中添加自定义标签,以便我可以跟踪消息来自哪个类/模块。 不幸的是,无论我做什么,都不会显示多余的痕迹! 基本上,以上所有内容均未对日志输出进行任何形式的修改。
1回复

提升日志记录,按命名范围过滤

我在我的应用程序中使用boost log,虽然配置起来很棘手,但它通常运行良好。 现在,我想在我的应用程序中添加一些更高级的过滤逻辑,我无法弄明白。 我想要的是有两个“级别”的过滤: 我已经在使用不同级别的“严重记录器”,如debug , warn , note等。这是设置
3回复

Boost是否支持循环文件?

我需要使用循环文件在磁盘上保留大量动态数据(一次写入,可能永远不会读取)。 更清楚地说,我想将文件视为循环缓冲区-即写入缓冲区将转到文件,而读取将是文件读取。 具体来说,我正在做日志。 我想知道boost是否具有我可以使用的任何功能(理想情况下是循环文件)。 我看到boost
1回复

段错误时std :: ofstream是否正确关闭?

当我的进程出现段错误时,std :: ofstream是否正确关闭并刷新缓冲区? 我怀疑segfault之前的日志消息丢失了,调试没有这些日志消息的长时间运行的c ++服务器很痛苦:(有人知道正确的日志记录方法是什么吗?
3回复

C ++日志框架是否牺牲了可重用性?

在C ++中,没有事实上的标准日志记录工具。 根据我的经验,商店自己动手。 但是,在尝试创建可重用的软件组件时,这会产生一些问题。 如果系统中的所有内容都依赖于日志记录组件,这会使软件不再可重用,基本上迫使任何下游项目将您的日志记录框架与他们真正想要的组件一起使用。 IOC(依赖注入
3回复

是否对if(0)和if(1)语句进行了优化?

为了进行调试,我想要一个预处理器定义,例如 并添加 无论我希望代码中发生什么。 现在,我只想在编译器能够读取的情况下执行此操作 例如,并且根本不将其添加到最终代码中。 或者如果if设置为true 删除if条件,仅添加该行。 那么,到底,做那些如果 s
1回复

log4cplus库是否支持Android的c ++ _ shared运行时库

我正在为Android编译log4cplus库,它需要c ++运行时STL库。 按照 https://github.com/log4cplus/log4cplus/blob/master/android/android.toolchain.cmake 行号:835-837如下: