Повышение: Сериализация: Кто очищает десериализованные данные?

Я сериализую и отправляю 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().

Другие вопросы по тегам