2017-05-11 1 views
9

getAName(getA().get())과 같은 함수 매개 변수를 전달하는 것이 안전합니까? getA() 개체를 반환 unique_ptr<A>.C++ : unique_ptr :: get()과 같은 인수를 함수에 전달하는 것이 안전합니까?

아래 코드를 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()); 
+1

cout을 사용하는 경우 c_str()가 필요하지 않습니다. – Kapil

답변

7

안전합니다. getA()temporarystd::unique_ptr을 반환하며 이는 전체 표현식 후에 소멸되며 getAName()의 호출을 유지합니다. 따라서 getAName()의 본문 내에서 전달 된 포인터는 유효합니다.

모든 임시 객체 (어휘)는 그들이 생성 된 지점을 포함하는 전체 표현을 평가의 마지막 단계에서 파괴

참고 인에서 포인터가 전달 된 경우가있다 (예 : 전역 변수)에 저장되고 나중에 사용되면 (즉, getAName() 호출 후) 포인터로 가리키는 객체는 임시 std::unique_ptr에 의해 소멸되고 포인터는 매달리게됩니다. 그 때 그것에 대한 복종은 UB이 될 것입니다. 이 경우, 보여준대로 이름이 지정된 변수가 필요할 수 있습니다.

+0

Btw UB는 무엇을 의미합니까? – Kapil

+0

@Kapil [정의되지 않은 동작] (https://en.wikipedia.org/wiki/Undefined_behavior). – songyuanyao

+0

세그먼트 화 오류 (SIGSEV)가되지 않습니까? – Kapil

관련 문제