为什么在64位系统上运行完美的c ++程序在32位系统上崩溃有什么理由?我在2台服务器上测试了一个程序。一个是64位,另一个是32位。该程序没有特定于位的命令。最初它是在两个工作,直到我做了一个chage并添加了一个结构并调用它。第一次调用此结构对象时,程序崩溃了。但是如果我在崩溃之前打印1行的值,那么值就在那里。顺便说一句,我的意思是整数,没有指针或其他有趣的东西。 我尝试将这些整数作为uint32_t和这样的实验启动。但要达到死胡同。
结构就像这样
struct info {
int id1, id2;
string test;
};
map<string, info> allInfo
vector<string> temp;
/* temp populated */
info details = {atoi(temp[0].c_str()),atoi(temp[2].c_str()),temp[3].c_str()};
allInfo[temp[1].c_str()] = details;
/*somewhere after this it is accessed */
map<string, info>::iterator i;
/* printing the values here seems ok.. */
cout << (*i).second.id1 << endl << (*i).second.id2 << endl;
string first_id = "idOne : " + (*i).second.id1;
string second_id = "idTwo: " + (*i).second.id2;
答案 0 :(得分:0)
一个简单的原因是未定义的行为。
答案 1 :(得分:0)
只是一个猜测。你是为/ 64位机器编译的吗? 可能有一些操作码在32位机器中不可用。
答案 2 :(得分:0)
所以没有强制转换,没有动态分配和32位构建崩溃而不是64位构建。我的第一个猜测就是访问范围之外的数组。
答案 3 :(得分:0)
有很多事情可能会出错,如果没有调试器,发现它将是一场噩梦。
选项1:说服拥有服务器管理员权限的任何人安装gdb
。
选项2:在任何地方添加打印语句,以确定segfault在此处发布的确切位置(或尝试自己解决)。
答案 4 :(得分:0)
你将整数添加到char数组中:
string first_id = "idOne : " + (*i).second.id1;
string second_id = "idTwo: " + (*i).second.id2;
可能是你的测试集不同而且在非投掷系统中你意外地获得了一个有效的地址来分配给字符串变量。