Вы не сказали, что означает «не работает»; он не компилируется? Он не загружает / не сохраняет значение должным образом? Это не ... что?
Здесь я могу выделить две проблемы, хотя одна может быть частью вашего намеренного дизайна.
Во-первых, вы не сделали правильный указатель в процедуре загрузки. Давайте разберемся:
inline void serialize(Archive & ar, std::shared_ptr<T> &t, const unsigned int version) {
if (1) { //unimportant
T* r;
ar >> r;
t = r;
}
}
Когда вы создаете объект из std :: shared_ptr, вы создаете экземпляр шаблона класса, чтобы обеспечить возможность, подобную указателю (как вы знаете). Если вы сделали с int, он будет работать как указатель int. Однако простая передача типа как T НЕ означает, что указатель, созданный для этого типа, будет автоматически использовать этот шаблон; действительно, вы создаете пустой указатель с помощью T * r. С таким же успехом это может быть int * r. Затем вы не можете инициализировать его с помощью new; r может указывать куда угодно. Если он был инициализирован правильно с новым, вы МОЖЕТЕ получить правильный подсчет ссылок для создания / удаления этого объекта; это одна из областей, где std :: shared_ptr мне кажется не стоит усилий. Я думаю, что присвоение голого указателя считается второй ссылкой, а не первой, но я могу ошибаться? Во всяком случае, проблема не в этом. Вы, вероятно, портите кучу; компилятор должен выдавать предупреждение об использовании неинициализированного указателя, удивительно, что этого не произошло. Надеюсь, у вас не отключены предупреждения.
Если я правильно помню, это объявление r нужно заменить на:
std::shared_ptr<T> r = new std::shared_ptr<T>;
Хотя может быть
std::shared_ptr<T> r = new std::shared_ptr<T>(r());
Я давно не использовал shared_ptr.
TR1, кстати, отсутствует как минимум 2 года. Он основан на увеличении shared_ptr. Я не знаю, почему вы используете Boost 1.46, но я думаю, что его уже не было к тому времени, когда shared_ptr стал частью стандарта? Так должно быть совместимо ...?
Во всяком случае, вторая потенциальная ошибка связана с
t = r;
Я предполагаю - неправильно? - что вы ХОТИТЕ уменьшить счетчик ссылок до t, переназначив его (и, возможно, уничтожив объект, на который указывает t). Если вы хотели скопировать его, вы, конечно, использовали бы:
*t = *r;
и убедитесь, что ваш конструктор копирования работает правильно.
person
std''OrgnlDave
schedule
12.01.2012
boost::serialization
эксперт, но пробовали ли вы скопироватьboost/serialization/shared_ptr.hpp
, на который вы ссылаетесь, и заменить всеboost::shared_ptr
наstd::shared_ptr
? - person Jeffrey Yasskin   schedule 16.12.2011