C++:传递像 unique_ptr:get() 这样的参数来函数是否安全?

C++: Is it safe to pass an argument like unique_ptr::get() to function

本文关键字:参数 是否 安全 函数 unique C++ get ptr      更新时间:2023-10-16

传递像getAName(getA().get())这样的函数参数是安全的吗? getA()返回一个对象unique_ptr<A>

我在VS 2010上用下面的整个代码进行测试,它可以工作。但我想确定它是否是 c++ 标准,它对其他 c++ 编译器是否安全?

#include "stdafx.h"
#include <memory>
#include <iostream>
using namespace std;
class A
{
public:
    A(){ cout<<"A()"<<endl;}
    ~A(){ cout<<"~A()"<<endl;}
    string name() { return "A"; }
};
std::unique_ptr<A> getA()
{
    return std::unique_ptr<A>(new A());;
}
void getAName(A* a)
{
    if(a)
    {
        cout << a->name().c_str() << endl;
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    getAName(getA().get());
    return 0;
}

控制台中的输出包括:

A()
A
~()

是否有必要使代码如下,以便对所有编译器安全?

unique_ptr<A> a = getA();
getAName(a.get());

它是安全的。 getA() 返回一个临时std::unique_ptr,它将在完整表达式后被销毁,这限制了getAName()的调用。因此,在getAName()体内传递的指针仍然有效。

所有临时对象都将被销毁,作为评估完整表达式的最后一步,该表达式(以词法方式(包含创建它们的点,...

请注意,如果传入的指针存储在某个地方(例如全局变量(,然后在以后使用(即在调用getAName()之后(,则指针指向的对象已被临时std::unique_ptr破坏,指针变得悬空;那么对它的尊重将是UB。如果是这种情况,如您所展示的,您可能需要一个命名变量。