Ошибка при попытке использовать библиотеку Boost Serialization - PullRequest
1 голос
/ 28 января 2012

У меня есть простая программа, которая воспроизводит проблему:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/tuple/tuple.hpp>
#include <sstream>
#include <iostream>    

template<typename T>
std::string serialize(const T & value)
{
    std::ostringstream oss;
    boost::archive::text_oarchive oa(oss);
    oa << value;
    return oss.str();
}    

template<typename T>
T deserialize(const std::string & buffer)
{
    std::istringstream iss(buffer);
    boost::archive::text_iarchive ia(iss);
    T ret;
    ia >> ret;
    return ret;
}    

struct MyClass
{
    MyClass() {}
    MyClass(const std::string & name) : name(name) {}

    template<class Archive>
    void serialize(Archive & ar, const unsigned int)
    {
        ar & name;
    }

    std::string name;
};    

int main()
{
    MyClass myClass("Test");
    std::string serialized = serialize(myClass);
    std::cout << "Serialized: " << serialized << std::endl;
    MyClass deserialized = deserialize<MyClass>(serialized);
    std::cout << "Name after deserialization: " << deserialized.name << std::endl;
}

Код прекрасно компилируется, но выдает следующую ошибку во время выполнения:

Serialized: 22 serialization::archive 9 0 0 4 Test
test(74010) malloc: *** error for object 0x109bf55e0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

В отладчике Iвидно, что ошибка возникает, когда boost пытается десериализовать переменную * 1007. *

Может кто-нибудь помочь мне выяснить, что я делаю неправильно?

Обновление

IНахожусь на Mac OS X Lion и использую GCC 4.6.2 (g++-mp-4.6 (GCC) 4.6.2) и версию Boost 1.48.Оба установлены через MacPorts.

Командная строка:

g++ -o test -I/opt/local/include -L/opt/local/lib main.cpp -lboost_serialization

Вы можете получить код из Subversion здесь: http://stacked -crooked.googlecode.com / svn / trunk /Игровая площадка / Сериализация .

Обновление

Я тестировал на Linux GCC 4.6.1 и boost 1.48, и он отлично работает.Это как-то должно быть проблемой, специфичной для моей конфигурации на Mac.

1 Ответ

0 голосов
/ 28 января 2012

Что случилось, было так:

  1. Boost был построен MacPorts с использованием встроенного Apple GCC 4.2.
  2. Я компилировал свою программу с не-Apple GCC 4.6.2 (также полученной от MacPorts).
  3. двоичный файл надстройки, который был загружен во время выполнения, был несовместим с моим двоичным файлом.
  4. Краш!
...