c++ - 将元素插入全局 map 时发生访问冲突

标签 c++ dictionary

我已经尝试调试了好几个小时,但没有成功。我知道你们会在几分钟内解决问题,所以情况是这样的:

我有大约 400 个名为 ProblemX.cpp/ProblemX.h 的 .cpp/.h 文件(其中 X 是从 1 到 400 的数字)。每个文件都包含数学相关问题的解决方案。我想让这些问题在编译时用一个唯一的键(只需一个 int 就可以)将它们自己注册到一个全局映射中,并将该值作为一个指向启动数学问题解决方案的函数的指针。

全局 map 在名为 Problem.h/Problem.cpp 的文件中创建和处理。但是,当第一个问题尝试在 map 中自行注册时,我收到“访问冲突读取位置 0x00000004”。代码如下:

在 ProblemX.h 文件中(问题 1 开始解决这个问题):

#ifndef PROBLEM1_H
#define PROBLEM1_H

#include "Problems.h"
#include <string>

std::string problem1();
static int rc1 = registerProblem(1, problem1);

#endif

Problems.h文件中(problemFinder是使用全局映射调用相应函数指针的函数):

#ifndef PROBLEMS_H
#define PROBLEMS_H

#include <string>

int registerProblem(int problemNum, std::string (*problemFunc)(void));
std::string problemFinder(int problemNum);

#endif

在 Problems.cpp 中:

#include "Problems.h"
#include <iostream>
#include <map>

using namespace std;

map<int,std::string (*)(void)> problems_map;

int registerProblem(int problemNum, string (*problemFunc)(void)) {
    int rc = 0;
    problems_map[problemNum] = problemFunc;
    return rc;
}


string problemFinder(int problemNum) {
    string retStr = "";
    retStr = problems_map[problemNum]();
    return retStr;
}

访问冲突发生在“problems_map[problemNum] = problemFunc;”处。

谢谢!

最佳答案

正如名字神秘的 user93353 回答的那样,problems_map 全局不能保证在其他文件中的全局之前构造。

为了避免静态初始化顺序失败,将 problems_map 设置为 local 静态,它将在首次使用时初始化:

map<int,std::string (*)(void)>&
get_problems_map()
{
  static map<int,std::string (*)(void)> problems_map;
  return problems_map;
}

然后像这样使用它:

get_problems_map()[problemNum] = problemFunc;

这确保 map 在需要时立即创建,而不仅仅是在 Problems.cpp 中的全局构造函数运行时创建,这可能(在您的情况下肯定是)在全局 rc1 变量被初始化。

关于c++ - 将元素插入全局 map 时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353519/

相关文章:

C++ 从接口(interface)类到子类的无效转换

C++:在 MFC 应用程序中使用 WM_ERASEBKGND 消息避免闪烁

python - 仅按其值之一对复杂的Python字典进行排序

dictionary - 如何检查 key 是否存在于 Elixir 的深度嵌套 Map 中

Python 字典和列表混淆

c++ - 除非某些参数发生变化,否则让函数只计算一次语句的最简单方法是什么?

c++ - 嵌套在其他任何类别中的已知类名称的C++模板 friend 声明

C++ - 一个函数会使其他函数发生故障

Python:将字典的项目除以取决于第一个键的值

python - 如何从仅部分知道 key 的python dict中检索?