BOOST_CLASS_EXPORT вызывает ошибку сегментации в конце main ()? - PullRequest
2 голосов
/ 08 ноября 2011

Я использую boost::serialization для своих занятий. Так как у меня есть наследство, я должен использовать BOOST_CLASS_EXPORT, чтобы «зарегистрировать» мой класс. Надеюсь, я ничего не понял.

Я использую этот макрос:

BOOST_CLASS_EXPORT(MyClass)

Или даже я использую это:

BOOST_CLASS_EXPORT_GUID(MyClass, "MyClass")

в одном заголовочном файле , например, MyClass.h, который также содержит определение MyClass. Однако даже если я попытался поместить макрос в один из моих исходных файлов (* .cpp), он снова завершился неудачей.

Я получаю ошибку сегментации в конце main(). Stacktrace показывает, что стек вызовов почти одинаков с этой проблемой . Я не могу найти решение или обойти эту проблему. Я думаю, что проблема из-за деструктора, но я не знаю, как ее решить. Я даже не могу сказать, что это моя ошибка или ошибка в наддуве. (Я надеюсь, что это моя вина, что я могу исправить это самостоятельно)

Есть ли какое-либо решение / обходной путь для этого? И почему возникает проблема?

Моя среда сборки: 64-битный сервер Ubuntu 10.04 (ядро 2.6.32), gcc 4.4.3, boost 1.40. (Я нашел его на /usr/include/boost/version.hpp и использую apt-cache show libboost-dev, чтобы увидеть версию)

Я использую -Wall -g3 -O0 в качестве опции компилятора.

Странно, проблема возникает только на одной из моих машин. Хорошо работает еще одна машина с CentOS (ядро 2.6.18), gcc 4.1.2 и boost 1.41.


Обновление: я сократил весь проект до небольшого примера. Это помещено в основание и также доступно на моя суть . Классы ничего не делают, а программа (моя) ничего не делает. Тем не менее BOOST_CLASS_EXPORT вызывает ошибку сегментации.

Обратите внимание, что если я удалю f1.cpp или f2.cpp, проблема исчезнет (требуется несколько модулей компиляции). Подобное состояние встречается на class A/A_child и B/B_child. Я понятия не имею, почему проблема не возникает только для одного класса.

Код

Compile

g++ -Wall -g3 -O0 -o program main.cpp f1.cpp f2.cpp -lboost_serialization

f1.cpp

#include "MyClass.h"

f2.cpp (то же самое с f1.cpp)

#include "MyClass.h"

main.cpp

int main(int argc, char *argv[])
{
}

MyClass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <boost/serialization/export.hpp>
#include <boost/serialization/vector.hpp>

using namespace std;

class A
{
public:
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
    }
};

class A_child: public A
{
public:
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<A>(*this);
    }
};
BOOST_CLASS_EXPORT(A_child)


class B
{
public:
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
    }
};

class B_child: public B
{
public:
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<B>(*this);
    }
};
BOOST_CLASS_EXPORT(B_child)


#endif
...