c++ - shared_ptr SIGSEGV 中的无序映射

标签 c++ lambda threadpool shared-ptr c++14

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

我需要创建无序映射来为每个客户端保存识别器实例。所以我创造了这个_

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

关于c++ - shared_ptr SIGSEGV 中的无序映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020040/

相关文章:

c++ - 在互斥量上使用多个 std::unique_lock,FIFO 中的所有线程都等待进程?

java - 是否可以在不一遍又一遍地创建线程的情况下使用多线程?

c++ - 如何删除在函数中创建的指针并作为返回值

c++ - 拥有 "Dynamic" vector 类

c# - 如何使用 Linq 或 Lambda 执行更新?(C#, Asp.net,Linq , Lambda)

java - 用 Java 中的流 API 调用替换 for-each 循环

javascript - 在ReactJS中使用axios GET作为axios POST

c# - 什么时候在 C# 中使用线程池?

c++ - 我正在尝试使用数组从头开始创建一个 strtok 函数

c++ - 内部 lambda 中的悬空引用