Повышение: Сериализация: Кто очищает десериализованные данные?
Я сериализую и отправляю raw-указатель объекта в другое приложение.
При десериализации я получаю еще один необработанный указатель. Это означает, что 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?
3 ответа
Мое понимание документации, касающейся сериализации указателей, заключается в том, что право собственности хранится в архиве: "Загрузка одного и того же объекта указателя несколько раз приводит к созданию только одного объекта, тем самым копируя исходную конфигурацию указателя". Это указывает на то, что библиотека занимается ведением бухгалтерского учета.
Кроме того, архив предоставляет delete_created_pointers
method: "Удаляет все объекты, созданные загрузкой указателей. Это можно использовать, чтобы избежать утечек памяти, которые могут возникнуть в противном случае, если загружаются указатели и при загрузке архива возникает исключение".
Я не понимаю почему AnyClass* object;
законно в этом контексте, ИМО у вас должен быть объект AnyClass
(Посмотрите на http://en.highscore.de/cpp/boost/serialization.html), а затем используйте его снова и снова. Теперь, когда этот объект (не указатель) выходит из области видимости, он будет удален.
Извините, что ответил на этот старый вопрос. Я попробовал демо, и обнаружил, что в нем есть утечка памяти. Демонстрация восстанавливает архив до объекта (который использует указатели внутри) в функции. Архив разрушается, когда функция возвращается, и объект возвращается. Выделенная память не очищается никем. Я модифицировал демо-версию для многократного запуска функции восстановления, а затем обнаружил, что процесс занимает все больше и больше памяти. Поэтому, если вам нужно очистить выделенную память, вручную удалите объекты с помощью указателя или вызовите delete_created_pointers().