2014-04-02 1 views
3

구체적으로 말해서 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이 데이터로드 중 생성 된 포인터를 관리하지 않는다는 것이 맞습니까?

+0

어디에서 소멸자가 호출되기를 기대합니까? –

+0

@ n.m. 개체가 해제되면. 사실 포인터가 어딘가에서 해제 될 것으로 기대하지 않습니다. 데모에서 제외하고 문서에서 설명하지 않는 것이 이상하게 느껴집니다. 다른 사람들은 포인터가 자동으로 해제 될 것이라고 생각합니다 [here] (http://stackoverflow.com/a/4122121/930095) –

+0

다른 사람들은 심각하게 착각합니다. 직렬화 복원 기계의 어느 부분도 직렬화 된 객체의 일부를 소유하지 않습니다. 왜 그런 생각이 다른 사람의 머리를 가로막을 지 모르겠다. "동일한 포인터 개체를 여러 번로드하면 하나의 개체 만 생성되므로 원래 포인터 구성을 복제 할 수 있습니다." 이것은 다른 것에 의해 소유되는 것에 대해 절대적으로 아무것도 말하지 않습니다. 창조 중 부기, 예. 창작 후 소유권 ... 어떤 환상인가? –

답변

2

결론 :

  • 포인터를로드하는 동안 저장되고 그들이 new에 의해 만들어집니다 가리키는 객체 (즉 boost::archive::detail::heap_allocator, boost::serialization::access::construct)는
  • 또한 boost::serialization::access::destroy 있습니다 만, AFAIK, 그것은 호출있어 아니에요 어디서나 boost에 있습니다.
  • boost::serialization에 의해 할당 된 객체를 해제하려면 delete (또는 원하는 경우 boost::serialization::access::destroy)을 사용하는 것이 좋습니다.
관련 문제