모든 std::shared_ptr
개체가 사라지면 제어 블록이 여전히 존재합니다 (즉, std::weak_ptr
의 작동 방식). 참조 된 개체 만 삭제됩니다.
이제 C++ 객체는 std::memcpy
only if it is trivially copyable을 통해 안전하게 복사 할 수 있습니다. TriviallyCopyable
개념의 요구 사항을 확인하면, std::weak_ptr
은 중요하지 않은 복사 생성자가 있기 때문에이를 만족시키지 못합니다. 사실,이 생성자는 컨트롤 블록 내부의 weak-pointers-counter를 증가시킬 것이므로 std::memcpy
으로 복사하면 불변성이 깨질 것입니다.
원시 버퍼에 std::weak_ptr
을 저장하는 것은 일반적인 코드에서 끔찍한 생각처럼 들립니다. 버퍼는 일반적으로 직렬화, 데이터 전송/쓰기 등에 사용되며 이러한 모든 작업은 스마트 포인터에 대해 무의미합니다. 그러나, 당신은 당신이 버퍼에 저장해야한다는 것을 절대적으로 확신한다면, 당신은 placement new
이 필요합니다
std::weak_ptr<T> the_one_i_want_to_copy;
std::weak_ptr<T> * buffer = ...;
new (buffer) std::weak_ptr<T> { the_one_i_want_to_copy };
을 주목 (buffer)
new
후 :이 메모리를 할당하는 것이 아니라 이미 준비 사용하지 new
을 알려줍니다 장소 (따라서 장소 멘토). buffer
을 준비 할 때 필요한 크기와 정렬을 제공하십시오.
http://en.cppreference.com/w/cpp/types/is_trivially_copyable#Notes. ['std :: weak_ptr'] (http://en.cppreference.com/w/cpp/memory/weak_ptr/weak_ptr)에는 올바르게 읽으면 중요한 생성자가 있습니다. – Justin
@ Justin non-trivial 생성자의 존재는 문제가되지 않으며, 단순한 복사 또는 이동 생성자 만 존재합니다. 그러나,'weak_ptr'를 복사 할 때 제어 블록을 수정해야하기 때문에, 구현시 사소한'std :: weak_ptr' 복사 생성자를 가질 수 없습니다. –
"_particularly std :: weak_ptr std :: shared_ptr_의 제어 블록에 대한 포인터"가 아니라 "**"** – curiousguy