>
배경

일반 포인터를 사용하면 다음과 같은 작업을 수행 할 수 있습니다

void conditional_reassign(MyClass* ptr)
{
    if (my_condition)
    {
        delete ptr;
        ptr = new MyClass(new_param);
    }
}

다음과 같이 변경하고 싶은 포인터를 전달할 수 있습니다

MyClass* ptr = new MyClass(old_param);
conditional_reassign(ptr);

std::unique_ptr 로 이것을 다시 구현하고 싶습니다 . 여기 제가 생각 해낸 내용이 있습니다.

std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr)
{
    if (my_condition)
    {
        ptr = std::make_unique<MyClass>(new_param);
    }
    return std::move(ptr);
}

그리고 다음과 같이 부르겠습니다

std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
ptr = std::move(conditional_reassign2(std::move(ptr)));

질문

라인의 자세한 내용에 만족하지 않습니다

ptr = conditional_reassign2(std::move(ptr));

conditional_reassign2 를 구현하는 방법이 있습니까   conditional_reassign(ptr) 와 비슷한 방식으로 호출 할 수 있도록

편집

과 관련한 주요 문제에 주목해야합니다

ptr = std::move(conditional_reassign2(std::move(ptr)));

원래 개체 ptr 를 파괴한다는 것입니다   my_condition 에 관계없이 지적  ( 스마트 포인터를 다시 할당하는 이유는 무엇입니까? 그 자체로 파괴를 일으키는가? )

  • 답변 # 1

    참조로 포인터를 전달해야합니다

    void conditional_reassign2(std::unique_ptr<MyClass>& ptr) {...}
    std::unique_ptr<MyClass> myPtr;
    conditional_reassign2(myPtr);
    
    

    단일 이동이 필요한 포인터를 반환

    std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr) {...}
    std::unique_ptr<MyClass> myPtr;
    myPtr = conditional_reassign2(std::move(myPtr));
    
    

    또한 명시 적으로 move를 호출하지 않고도 함수에서 직접 ptr을 반환 할 수 있습니다.

    std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr)
    {
        if (my_condition)
            ptr = std::make_unique<MyClass>(new_param);
        return ptr;
    }
    
    

  • 답변 # 2

    conditional_reassign2() 를 정의 할 수 있습니다   std::unique_ptr 를 가지고 기능  가치 기준대신참조 기준:

    void conditional_reassign2(std::unique_ptr<MyClass>& ptr)
    {
        if (my_condition)
        {
            ptr = std::make_unique<MyClass>(new_param);
        }
    }
    
    

    이 방법으로 함수는 전달되는 인스턴스를 직접 수정할 수 있으므로 소유권을 이전 할 필요가 없습니다.

    ptr 가정   std::unique_ptr<MyClass> 입니다 그런 다음 conditional_reassign2() 를 호출  이 경우에 :

    conditional_reassign2(ptr);
    
    

  • 답변 # 3

    첫 번째 예는 의도 한대로하지 않습니다. ptr 로  값으로 전달되면 호출자의 포인터가 수정되지 않습니다. 만약 my_condition   true 입니다 호출자에게 삭제 된 객체를 가리키는 포인터가 있으며, 함수가 반환 된 후 새로 작성된 객체가 저장된 주소가 손실됩니다.

    다음은 고정 된 첫 번째 예입니다 (인수는 이제 포인터에 대한 참조입니다) :

    void conditional_reassign((MyClass*)& ptr)
    {
        if (my_condition)
        {
            delete ptr;
            ptr = new MyClass(new_param);
        }
    }
    
    

    unique_ptr을 사용하기 위해 참조를 사용하고 아무 것도 반환하지 않을 수 있습니다. 이 방법으로 std::move 를 다룰 필요가 없습니다.

    void conditional_reassign2(std::unique_ptr<MyClass>& ptr)
    {
        if (my_condition)
        {
            ptr =  std::make_unique<MyClass>(new_param);
        }
    }
    
    

    다음과 같이 호출 할 수 있습니다 :

    std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
    conditional_reassign2(ptr);
    
    

    반환/이동 시맨틱을 사용할 수 있습니다 :

    std::unique_ptr<MyClass> conditional_reassign(std::unique_ptr<MyClass> ptr)
    {
        if (my_condition)
        {
            return std::make_unique<MyClass>(new_param);
        }
        return ptr;
    }
    
    

    그리고 다음과 같이 부르십시오 :

    std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
    ptr = conditional_reassign2(std::move(ptr));
    
    

관련 자료

  • 이전 관리자 (Hashicorp-consul)에서 Vault (Hashicorp-Vault)를 서비스로 등록하는 방법, kubernetes를 사용하고 있습니까?
  • 다음 Maven Pomxml 문제