C++ unique_ptr的范围是否为常量?

C++ unique_ptr的范围是否为常量?,c++,logging,C++,Logging,我想在方法中使用unique_ptr。我想依靠这样一个事实,即它在方法的右括号处被破坏,如果这确实是真的 我之所以想依赖这一事实,是因为我想编写一个简单的日志类,说明何时输入/退出了一个方法,比如: class MethodTracing { string _signature; public: MethodTracing(string signature) { _signature=signature;

我想在方法中使用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__) ) ;
    /// ... 
}
如果在方法中创建一个唯一的_ptr,并假定它没有被传递,那么它在方法结束时会被销毁,这是真实且一致的吗

有没有其他隐藏的或其他!我应该注意的陷阱

更新:
正如大多数答案所暗示的,我本可以使用局部变量范围。我用MethodTracing\uuuu funsig\uuuuu;,尝试过这个;,当然,我没有指定局部变量!因此,它立即超出了范围。我认为运行时很聪明,但不,是我在C语言中太愚蠢了

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

void myMethod( )
{
  MethodTracing __sig(__FUNCSIG__);

  // do stuff
}
__sig将在功能范围结束时自动销毁


是的,sig是一种糟糕的形式,如果你想叫它别的名字,你通常可以依赖它。例外情况是显式调用terminate的代码。通常,当对象的析构函数超出局部变量的范围时,即方法结束时,将调用它们。这是.

是的基础,没错。但当控件流经右大括号时并不一定如此。这可能是因为返回、异常或跳出其块


但是,在调用exit终止程序时应小心。当地的自动装置,如你独特的ptr,将不会被摧毁

是的,unique_ptr在其创建的作用域末尾被销毁。然而,你不需要UnQuyPPTR来获得这个功能,因为所有C++类都有这个功能。您也可以直接创建MethodTracing对象:

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

如果~MethodTracing析构函数比上面描述的更复杂,那么应该确保它不会被抛出,否则类可能只会被部分销毁


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

任何既不返回也不抛出异常的函数都会导致以下情况:退出、中止、终止和一些raise情况;析构函数也可以通过LojMP跳过,但是没有C++程序应该使用这个函数。一般来说,C++程序不应该使用Exchange,其他情况代表异常程序终止,在那里通常是可接受的,通常最好不要调用析构函数。我不敢相信这不是真的picked@parapura拉吉库马尔:聪明的指针很好。具有自动存储的值类型甚至更好。