ldl*_*ina 9 c++ stl temporary unique-ptr c++11
传递函数参数是否安全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;
}
Run Code Online (Sandbox Code Playgroud)
控制台中的输出是:
A()
A
~()
Run Code Online (Sandbox Code Playgroud)
为了所有编译器的安全,是否有必要使代码如下所示?
unique_ptr<A> a = getA();
getAName(a.get());
Run Code Online (Sandbox Code Playgroud)
这很安全.getA()返回一个临时的 std::unique_ptr,它将在完整表达式后被销毁,这会占用调用getAName().所以在getAName()传递的指针体内仍然有效.
所有临时对象都被销毁,作为评估(词法上)包含创建它们的点的全表达式的最后一步,...
请注意,如果传入的指针存储在某处(例如全局变量),然后稍后使用(即在调用之后getAName()),则指针指向的对象已被临时销毁,std::unique_ptr指针变为悬空; 那么对它的尊重就是UB.如果是这种情况,如您所示,您可能需要一个命名变量.
| 归档时间: |
|
| 查看次数: |
365 次 |
| 最近记录: |