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
'UFO ET IT' 카테고리의 다른 글
지원되지 않는 작업 : Android, Retrofit, OkHttp. (0) | 2021.01.10 |
---|---|
선형 레이아웃을 수직 중앙에 정렬하는 방법은 무엇입니까? (0) | 2021.01.09 |
처음 10000 개의 소수에 대한 가장 효율적인 코드? (0) | 2021.01.09 |
Core Data Managed Object를 복제하거나 복사하려면 어떻게해야합니까? (0) | 2021.01.09 |
SQL Server 2008은 특수 스키마 아래의 모든 테이블을 삭제합니다. (0) | 2021.01.09 |