UFO ET IT

unique_ptr :: release ()는 소멸자를 호출합니까?

ufoet 2021. 1. 9. 10:39
반응형

unique_ptr :: release ()는 소멸자를 호출합니까?


이 코드가 맞습니까?

auto v =  make_unique<int>(12);
v.release();     // is this possible?

delete원시 포인터 와 동일 합니까?


아니요, 코드로 인해 메모리 누수가 발생합니다. release관리 개체 삭제 하지 않고 소유권을 해제하는 데 사용됩니다 .

auto v = make_unique<int>(12);  // manages the object
int * raw = v.release();        // pointer to no-longer-managed object
delete raw;                     // needs manual deletion

안전망없이 원시 메모리를 조작 할 합당한 이유가없는 한이 작업을 수행하지 마십시오.

개체를 삭제하려면 reset.

auto v = make_unique<int>(12);  // manages the object
v.reset();                      // delete the object, leaving v empty

이 코드가 맞습니까?

아니요 std::unique_ptr<>::reset(). 내부 원시 포인터를 삭제하는 데 사용 합니다.

auto v =  std::make_unique<int>(12);
v.reset(); // deletes the raw pointer

이 작업이 완료되면 std::unique_ptr<>::get()nullptr( 가) 반환됩니다 (에 nullptr매개 변수가 아닌 경우 std::unique_ptr<>::reset()).


이 코드가 맞습니까?

그렇지 않으며 누출됩니다.

release()호출 코드가 호출 unique_ptr될 때까지 보유한 메모리의 소유권을 되찾도록하십시오 . 에서 반환 한 포인터를 할당하지 않으면 release()누수가 발생합니다.

A에 대한 명시 적 삭제가 unique_ptr될 것이다 reset(). 그러나 unique_ptr그들이 보유하고있는 기억을 직접 관리 할 필요가 없도록 그것이 있다는 것을 기억하십시오 . 즉, unique_ptr범위를 벗어나면 기본 원시 포인터를 안전하게 삭제할 것임을 알아야합니다 .

따라서 자동 메모리 관리 개체에 대해 수동 메모리 관리를 수행해야하는 아주 좋은 이유가 있어야합니다.


release 아무것도 할당하지 않기 때문에 원시 포인터가 누출됩니다.

다음과 같은 용도로 사용됩니다.

int* x = v.release();

v, 해당 포인터의 수명을 더 이상 관리하지 않고 원시 포인터 소유권을 x. 당신이 경우 단지 release아무것도 지정하지 않고, 당신은 원시 포인터를 유출.


임의 유형의 경우 약간 까다로울 수 있습니다.

  unique_ptr<Foo> v = get_me_some_foo();  // manages the object
  Foo * raw = v.release();        // pointer to no-longer-managed object
  delete raw;

거의 정확합니다.

  unique_ptr<Foo> v = get_me_some_foo();  // manages the object
  Foo * ptr = v.release();        // pointer to no-longer-managed object
  v.get_deleter() ( ptr );

이것은 모든 상황에서 정확할 것입니다. Foo 유형에 정의 된 사용자 지정 삭제자가있을 수 있지만 unique_ptr 개체에서 반환 한 삭제자를 사용하는 것은 모든 경우에 좋습니다.

참조 URL : https://stackoverflow.com/questions/25609457/does-unique-ptrrelease-call-the-destructor

반응형