我已经尝试调试了好几个小时,但没有成功。我知道你们会在几分钟内解决问题,所以情况是这样的:
我有大约 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/