C++:传递像 unique_ptr:get() 这样的参数来函数是否安全?
C++: Is it safe to pass an argument like unique_ptr::get() to function
传递像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。如果是这种情况,如您所展示的,您可能需要一个命名变量。
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 如果返回 -1,时间() 的参数是否被修改?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 检查两个模板参数是否相同
- 空函数的参数是否加载到缓存中?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 了解'this'或其他参数是否为右值
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 如何检查模板参数是否为给定值?
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 通过 ssh 发送参数.是否有非阻塞输入函数?
- 如何检查运算符 != 模板参数是否存在 C++ 17?
- 常量引用函数参数:是否可以禁止临时对象?
- 如何检查模板参数是否为 std::variant?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 移动 l 值参考参数是否是一种不好的做法?
- 显式指定通用 lambda 的 operator() 模板参数是否合法?