shared_ptr SIGSEGV 中的无序映射
Unordered map in shared_ptr SIGSEGV
我正在为语音识别器构建服务器。我正在使用线程池来为客户提供服务。
我需要创建无序映射来为每个客户端保存识别器实例。所以我创建了这个_
std::shared_ptr<std::unordered_map<int ,SOnlineSpeechRecognizerI *>> user_recognizers;
std::mutex rec_mutex;
所以在客户端连接上,我创建了识别器实例,我需要将数据插入 user_recognizers。我的 lambda 函数是:
echo.onopen=[user_recognizers, &rec_mutex](auto connection) {
std::cout << "Server: Opened connection " << (size_t)connection.get() << std::endl;
SOnlineSpeechRecognizerI *rec = recognizer::initRecognizer();
if(!rec){
connection.
}
std::pair<int, SOnlineSpeechRecognizerI *> myrec ((size_t)connection.get(), rec);
rec_mutex.lock();
(*user_recognizers).insert(myrec); //error here
rec_mutex.unlock();
};
connection.get() return 连接的 int ID。
我收到 SIGSEGV。 Valgrind 给了我一点提示:
Access not within mapped region at address 0x8
显然你没有初始化user_recognizers
,因此当你访问它时它持有一个导致段错误的空指针。
你可以像这样初始化它:
using MyMap = std::unordered_map<int ,SOnlineSpeechRecognizerI *>;
std::shared_ptr<MyMap> user_recognizers { std::make_shared<MyMap>() };
(我假设 user_recognizers
是一些 class 成员,所以它不能用 auto
声明)
我正在为语音识别器构建服务器。我正在使用线程池来为客户提供服务。
我需要创建无序映射来为每个客户端保存识别器实例。所以我创建了这个_
std::shared_ptr<std::unordered_map<int ,SOnlineSpeechRecognizerI *>> user_recognizers;
std::mutex rec_mutex;
所以在客户端连接上,我创建了识别器实例,我需要将数据插入 user_recognizers。我的 lambda 函数是:
echo.onopen=[user_recognizers, &rec_mutex](auto connection) {
std::cout << "Server: Opened connection " << (size_t)connection.get() << std::endl;
SOnlineSpeechRecognizerI *rec = recognizer::initRecognizer();
if(!rec){
connection.
}
std::pair<int, SOnlineSpeechRecognizerI *> myrec ((size_t)connection.get(), rec);
rec_mutex.lock();
(*user_recognizers).insert(myrec); //error here
rec_mutex.unlock();
};
connection.get() return 连接的 int ID。
我收到 SIGSEGV。 Valgrind 给了我一点提示:
Access not within mapped region at address 0x8
显然你没有初始化user_recognizers
,因此当你访问它时它持有一个导致段错误的空指针。
你可以像这样初始化它:
using MyMap = std::unordered_map<int ,SOnlineSpeechRecognizerI *>;
std::shared_ptr<MyMap> user_recognizers { std::make_shared<MyMap>() };
(我假设 user_recognizers
是一些 class 成员,所以它不能用 auto
声明)