В настоящее время я работаю над приложением, которое загружает общую библиотеку, содержащую глобальное хранилище операций (это упрощенный вид функции). В очень упрощенном виде, это то, что у меня есть:Сбрасывание глобальных переменных при загрузке разделяемой библиотеки
Общий 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
Если у кого есть какие-либо идеи, пожалуйста, помогите.
Запустите valgrind, чтобы узнать, где он бомбит. – user562374