SIGSEGV shared_ptr中的无序列图

Unordered map in shared_ptr SIGSEGV

本文关键字:无序 shared ptr SIGSEGV      更新时间:2023-10-16

我正在为语音识别器构建服务器。我正在使用线程池来为客户端提供服务。

我需要创建无序列图来保存每个客户端的识别器实例。所以我创造了this_

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() 返回连接的 int ID。

我正在接受SIGSEGV。瓦尔格林德给了我一点提示:

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是一个类成员,所以不能用auto声明)