Boost:Serialization: Кто очищает десериализованные данные?

Я сериализую и отправляю необработанный указатель объекта в другое приложение.

При десериализации я получаю еще один необработанный указатель. Это означает, что Boost::Serialization создает объект за этим указателем внутри. Теперь мне любопытно, кто владеет объектом, и удалит ли Boost этот объект, если он больше не нужен.

Некоторый код, который, возможно, лучше показывает, в чем вопрос:

void anyMethod()
{
    std::ifstream file("archiv.txt"); 
    boost::archive::text_iarchive ia(file); 
    AnyClass* object; 
    ia >> object; 
    //work with object
}

//Now what has happened to object?
//Is it deleted, cause it went out of scope?
//Do I have to delete it myself?

person MOnsDaR    schedule 08.11.2010    source источник
comment
Вероятно, вам нужно привести себя в порядок. в общем, С++ очень много, если вы хотите, чтобы время, потраченное на что-то, было сделано, явно скажите, что вы хотите, чтобы это время было потрачено.   -  person thecoshman    schedule 08.11.2010


Ответы (3)


Мое понимание документации относительно указателей сериализация заключается в том, что право собственности сохраняется за архивом: «Загрузка одного и того же объекта указателя несколько раз приводит к созданию только одного объекта, тем самым копируя исходную конфигурацию указателя». Это, как правило, указывает на то, что библиотека занимается бухгалтерским учетом.

Кроме того, архив предоставляет метод delete_created_pointers: «Удаляет все объекты, созданные при загрузке указателей. Это можно использовать, чтобы избежать утечек памяти, которые могли бы произойти, если указатели загружаются, а загрузка архива сталкивается с исключением».

person icecrime    schedule 08.11.2010
comment
Большое спасибо, это именно то, что я искал - person MOnsDaR; 08.11.2010

Я не понимаю, почему AnyClass* object; является законным в этом контексте, IMO у вас должен быть объект AnyClass (см. http://en.highscore.de/cpp/boost/serialization.html), а затем повторно используйте его снова и снова. Теперь, когда этот объект (не указатель) выходит за пределы области видимости, он будет удален.

person Rohan Monga    schedule 08.11.2010
comment
Boost::Serialization также может десериализовать указатели, что очень важно при выполнении полиморфных сериализаций. - person MOnsDaR; 08.11.2010

Извините, что отвечаю на этот старый вопрос. Я попробовал демо и обнаружил, что утечка памяти. Демонстрация восстанавливает архив в объект (внутренне использующий указатели) в функции. Архив уничтожается, когда функция возвращается, и объект возвращается. Выделенная память никем не очищается. Я много раз модифицировал демо, чтобы запускать функцию восстановления, а затем обнаружил, что процесс требует все больше и больше памяти. Поэтому, если вам нужно очистить выделенную память, вручную удалите объекты через указатель или вызовите delete_created_pointers().

person user200851    schedule 19.06.2015