У меня есть класс, который является менеджером ресурсов, и я храню данные на карте <<code>QString, void*
>, и класс выглядит так:
template <typename R>
class ResourceManager
{
public:
ResourceManager() = default;
template <typename T>
void set(const R& name, T& object);
template <typename T>
T get(const R& name);
private:
QHash<R, void*> m_objectsMap;
};
template <typename R>
template <typename T>
void ResourceManager<R>::set(const R& name, T& object) {
m_objectsMap.insert(name, reinterpret_cast<void*>(&object));
}
template <typename R>
template <typename T>
T ResourceManager<R>::get(const R& name) {
auto it = m_objectsMap.find(name);
if (it == m_objectsMap.end()) throw std::invalid_argument("The item doesn't exists");
return *static_cast<T*>(it.value());
}
У меня есть такая структура:
struct UserData {
QString username = "";
QString permissions = "";
QString token = "";
qint64 lastTimeUsed = 0;
UserData() {}
};
И в следующей функции я настроил ее:
void f() {
UserData userData;
userData.username = userStruct.username;
userData.permissions = userStruct.permissions;
userData.token = token;
userData.updateLastTimeUsed();
qDebug() << "[Users][actionCheckToken]userData='" << userData.toString() << "'";
client.getResourceManager()->set<UserData>(USER_RESOURCEMANAGER_USERDATA_KEY, userData);
}
Если я позвоню get
сразу после установки, она будет работать, но если я вызову ее позже,в другой функции я получаю SIGSEGV
:
1 std::__atomic_base<int>::load atomic_base.h 396 0x55555556500e
2 QAtomicOps<int>::load<int> qatomic_cxx11.h 227 0x55555556500e
3 QBasicAtomicInteger<int>::load qbasicatomic.h 103 0x555555563e5e
4 QtPrivate::RefCount::ref qrefcount.h 55 0x5555555624a6
5 QString::QString qstring.h 958 0x5555555629a9
6 Users::UserData::UserData <- my struct Users.hpp 26 0x555555578cf1
7 ResourceManager<QString>::get<Users::UserData> ResourceManager.hpp 36 0x555555578df4
8 [function from where I call]
Я проверил, что мои указатели / ссылки действительны, и они также указывают на правильное местоположение (тот же менеджер ресурсов), но я неНе знаю, почему происходит сбой, но если я вызываю сразу после вызова set
, это работает.
Вот как выглядит функция, которую я вызываю позже:
void b(Client& client) {
qDebug() << "[Users][userIsLogged]Called" << "clientID='" + client.getID() + "'";
auto userData = client.getResourceManager()->get<UserData>(USER_RESOURCEMANAGER_USERDATA_KEY);
// ...
}