C++ unique_ptr的范围是否为常量?
我想在方法中使用unique_ptr。我想依靠这样一个事实,即它在方法的右括号处被破坏,如果这确实是真的 我之所以想依赖这一事实,是因为我想编写一个简单的日志类,说明何时输入/退出了一个方法,比如:C++ unique_ptr的范围是否为常量?,c++,logging,C++,Logging,我想在方法中使用unique_ptr。我想依靠这样一个事实,即它在方法的右括号处被破坏,如果这确实是真的 我之所以想依赖这一事实,是因为我想编写一个简单的日志类,说明何时输入/退出了一个方法,比如: class MethodTracing { string _signature; public: MethodTracing(string signature) { _signature=signature;
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拉吉库马尔:聪明的指针很好。具有自动存储的值类型甚至更好。