2011-01-10 3 views
0

В настоящее время я работаю над приложением, которое загружает общую библиотеку, содержащую глобальное хранилище операций (это упрощенный вид функции). В очень упрощенном виде, это то, что у меня есть:Сбрасывание глобальных переменных при загрузке разделяемой библиотеки

Общий libary имеет класс, который регистрирует операции в магазине и выглядит что-то похожее на:

// Factory.h 

class Factory 
{ 
public: 
    typedef void (*FuncPtr)(); 
    typedef std::multimap<std::string, FuncPtr> StoreType; 

static void Register(const std::string& name, FuncPtr func) 
{ 
    m_Store.insert(std::pair<std::string, FuncPtr>(name, func)); 

    using namespace std; 
    cout << "*** Count: " << ++Count << ", Size: " << m_Store.size() << endl; 
} 

public: 
    static StoreType m_Store; 
    static int Count; 
}; 


struct Register 
{ 
    Register(const std::string& name, Factory::FuncPtr func) 
    { 
     Factory::Register(name, func); 
    } 
}; 



// Factory.cpp 
#include "Factory.h" 

Factory::StoreType Factory::m_Store; 
int Factory::Count = 0; 

Есть также несколько .cpp файлов в библиотеке, которая регистрирует операции. Регистрация происходит как:

void Func() 
{ 
... // some operation 
} 

Register obj("name", Func); 

При выполнении основного приложения библиотека загружается как зависимость. В основном приложении есть некоторый .cpp, который регистрирует операции.

выход я получаю, когда я бегу этот код:
--- Count: 1, размер: 1
--- Кол-во: 2, Размер: 2
--- Кол-во: 3, Размер: 3
--- Count: 4, Размер: 4
--- Count: 5, Размер: 1
--- Count: 6, Размер: 2
--- Count: 7, размер: 3
--- Количество: 8, Размер: 4
--- Количество: 9, Размер: 5
--- Количество: 10, Размер: 6 --- Кол-во: 11, Размер: 7
--- Кол-во: 12, Размер: 8

Обратите внимание, как размер станд :: Multimap сбрасывается после загрузки разделяемой библиотеки!

Кроме того, когда я использовал зЬй :: карту вместо ЗППП :: Multimap я получаю ошибку сегментации на:. _ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base с libstdC++ so.6

Чтобы отладить проблему, я написал упрощенную версию выше, и он работает так, как ожидалось, поэтому я предполагаю, что есть проблема с нашим основным приложением, но я действительно не знаю, где. Я просмотрел параметры компилятора и компоновщика и обеспечил, чтобы тестовое приложение имело те же настройки.

Среда разработки:
осознанных сборки г ++ версии 4.4.3

Если у кого есть какие-либо идеи, пожалуйста, помогите.

+0

Запустите valgrind, чтобы узнать, где он бомбит. – user562374

ответ

0

Я просто хочу сказать, что ваш пример работает отлично в моей среде (с использованием Multimap или карту данных типов):

*** Count: 1, Size: 1 
*** Count: 2, Size: 2 
*** Count: 3, Size: 3 
*** Count: 4, Size: 4 
*** Count: 5, Size: 5 
*** Count: 6, Size: 6 
*** Count: 7, Size: 7 
*** Count: 8, Size: 8 
*** Count: 9, Size: 9 
*** Count: 10, Size: 10 
*** Count: 11, Size: 11 
*** Count: 12, Size: 12 

среды:. OpenSUSE-11.3, г ++ 4.5.0, libstdC++ so.6.0 .14 ​​

Попробуйте проверить max_size() вашей карты и проверить код ошибки insert() для каждого вызова.

Смежные вопросы