2017-11-25 31 views
3

이다?를 rvalue 소멸자가 호출 될 때/다음 래퍼 클래스는 <code>me</code>을 복사하지 않고 <code>me</code> 멤버에 액세스 할 수 <code>std::unique_ptr</code>와 중간 개체를 유지의 "OK"방법이 확인

여기서 I는 who 포인터를 얻기 위해 다수의 개체를 정의 myobj_wrapper

#include <iostream> 
#include <memory> 

/* myobj from another library */ 
class myobj { 
public: 
    std::string me; /* actual member of interest is larger and more 
         complicated. Don't want to copy of me or myobj */ 

    /* more members in actual class */ 

    myobj(std::string i_am) { 
     /* more stuff happens in constructor */ 
     me = i_am; 
    } 

    ~myobj(){ 
     std::cout << me << ": Goodbye" << std::endl; 
    } 
}; 

/* A function in another library */ 
void who_is_this(std::string *who){ 
    std::cout << "This is " << *who << std::endl; 
} 

/* wrapper which I define */ 
class myobj_wrapper { 
    using obj_ptr = std::unique_ptr<myobj>; 
    obj_ptr ptr; 

public: 
    std::string *who; 

    myobj_wrapper(std::string i_am): 
     ptr(new myobj(i_am)), who(&ptr.get()->me) {} 

    myobj_wrapper(myobj &the_obj): who(&the_obj.me) { } 
}; 

int main() 
{ 
    { 
     myobj bob("Bob"); 
     who_is_this(myobj_wrapper(bob).who); 
    } 

    who_is_this(myobj_wrapper("Alice").who); 

    return 0; 
} 

생성 프로그램 수율

This is Bob 
Bob: Goodbye 
This is Alice 
Alice: Goodbye 

예를이다. 관심 대상 객체 (위의 std::string)가 who_is_this 함수에서 평가되기 전에 파괴되는지 여부에 대해 확실하지 않습니다. 위와는 같지 않지만 이것을 예상해야합니까? 위의 해결책에 함정이 있습니까?

who_is_this(myobj_wrapper("Alice").who); 

이 인수로 문자열 리터럴을 것, 래퍼 객체를 생성합니다 : 여기 잘 모르겠지만,

+0

코드 나는 운동의 요점을 이해하지 못한다는 것을 인정해야 하겠지만, 나는 이것이 아마도 soluti 인 문제를 이해하지 못한다. ~에. –

+0

** rvalue destructor **는 무슨 뜻입니까? –

+0

'who_is_this (myobj_wrapper ("Alice"))에서 동적으로 할당 된 객체를 의미합니다.; –

답변

1

는 견해이다. 그런 다음 myobj 인스턴스가 동적으로 만들어 져서 고유 한 포인터로 전달됩니다. 이 인스턴스를 통해 데이터 (문자열)를 가져 와서 래퍼 클래스에서 래퍼 클래스 포인터를 가리키는 전통적인 포인터를 만든다. 이제 whome, 즉 Alice를 가리키고 있습니다. 원본 데이터에 대한

void who_is_this(std::string *who) 
함수의 매개 변수 who하지 사본 것을 의미

하지만 포인트 :

우리는에 (포인터 인) who를 전달합니다.

그럼 이제 전체 질문은 범위를 벗어날 것입니다 (따라서 데이터 멤버 (고유 포인터)도 범위를 벗어납니다. 즉, 동적으로 생성 된 myobj 인스턴스가 가비지 수집됩니다 , 회전에서 이는 me 너무 범위를 벗어나 이동 등 who을 것이다 것을 의미합니다. who_is_this()이 코드가 OK 인 즉, 실행 도착 후

랩퍼 오브젝트는, 범위를 벗어나 이동합니다.

+0

"** who_is_this()가 실행되면 ** 래퍼 객체가 범위를 벗어납니다. 코드는 OK입니다. "멋진 답변입니다. –

+1

Thx. 나는 누군가가 함정에 관한 의견을 추가 할 수 있다고 생각했다. 나는 아무것도 없다고 생각한다. 구체적인 예는 Armadillo 라이브러리를 사용하는 [여기] (https://github.com/boennecd/dynamichazard/blob/master/src/problem_data.h)입니다. 'map_res' 클래스와'lp_map' 메소드를보세요. 때로는 새로운'arma :: vec'가 필요하고, 다른 때에는 새로운 객체를 만들 필요가 없습니다. (클래스 위의 주석을 무시하십시오 - 잘못되었습니다). –