Краткий ответ: да, это происходит.
Причина (как можно заключить из других ответов и комментариев) в том, что это незначительное злоупотребление тем, что должна делать библиотека сериализации.Таким образом, если кто-то использует расширенную сериализацию для записи объектов в течение дня (например, не все объекты находятся в памяти в начале сериализации), и объекты имеют одинаковый адрес, они будут неправильно распределены.Это происходит на общих указателях, но также и на обычных указателях (насколько я понимаю).
Чтобы устранить эту проблему, либо избегайте указателей, либо отключите отслеживание.Если вы отключите отслеживание и по-прежнему сериализуете общие указатели (что я и делаю в настоящее время, хотя это может и не быть идеальным), несколько жестко закодированных проверок в надстройке жалуются на отключение отслеживания.Чтобы обойти это, я взломал мою локальную копию заголовков наддува (и должен был делать это при каждом обновлении и системе, используемой для компиляции) (хотя это довольно просто, компилятор указывает на правильные строки, и они четко задокументированы),Если у вас есть возможность работать без указателей, вы избавите себя от этой проблемы.
Помимо этого, ведение журнала работает блестяще, поэтому не стоит отключать использование для этого расширенной сериализации (некоторые комментариипредложенное выше).
Чтобы регистрировать объекты по мере их поступления, просто используйте void Log(Msg* msg) {ar & NVP(msg);}
и читайте их что-нибудь по следующим строкам:
Msg* Read() {
Msg* msg(0);
try {ar & NVP(msg);}
catch (boost::archive::archive_exception const&) { }
return msg;
}
Вы вызываете функцию Read выше, пока не вернется указательэто нулевой указатель, тогда вы знаете, что журнал завершен.