구체적으로 말해서 Boost.Serialization 튜토리얼 here의 데모를 언급하고 있습니다.Boost.Serialization은 포인터로드 중 생성 된 메모리를 해제합니까?
위의 데모에서 bus_top
인스턴스는 bus_route
에 포인터로 저장되어 포인터의 직렬화 방법을 보여줍니다. 그러나 흥미로운 동작을 발견했습니다. 즉, 에 의해 생성 된 bus_stop
개체에 대해 소멸자 bus_stop::~bus_stop()
이 호출되지 않습니다. 나는 bus_stop::~bus_stop()
에 중단 점을 넣었고 main
함수의 끝에 delete
문에 의해서만 트리거되었습니다.
직렬화 된 데이터를로드하는 동안 에 boost/archive/detail/iserializer.hpp
으로 정의 된 포인터를 초기화하는 데 사용되는 개체는 heap_allocator
을 사용하여 공간을 할당합니다.
destroy
은 할당 된 메모리를 해제하기 위해 boost/serialization/access.hpp
에있는 기능을 가지고 있지만 호출 된 적이없는 것으로 보입니다.
Boost.Serialization이 데이터로드 중 생성 된 포인터를 관리하지 않는다는 것이 맞습니까?
어디에서 소멸자가 호출되기를 기대합니까? –
@ n.m. 개체가 해제되면. 사실 포인터가 어딘가에서 해제 될 것으로 기대하지 않습니다. 데모에서 제외하고 문서에서 설명하지 않는 것이 이상하게 느껴집니다. 다른 사람들은 포인터가 자동으로 해제 될 것이라고 생각합니다 [here] (http://stackoverflow.com/a/4122121/930095) –
다른 사람들은 심각하게 착각합니다. 직렬화 복원 기계의 어느 부분도 직렬화 된 객체의 일부를 소유하지 않습니다. 왜 그런 생각이 다른 사람의 머리를 가로막을 지 모르겠다. "동일한 포인터 개체를 여러 번로드하면 하나의 개체 만 생성되므로 원래 포인터 구성을 복제 할 수 있습니다." 이것은 다른 것에 의해 소유되는 것에 대해 절대적으로 아무것도 말하지 않습니다. 창조 중 부기, 예. 창작 후 소유권 ... 어떤 환상인가? –