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
Вероятно трябва да се почистите. като цяло C++ е много, ако искате времето, прекарано за нещо, да бъде направено, изрично кажете, че искате това време.   -  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