繁体   English   中英

在64位和32位系统上运行程序

[英]Running a program on a 64bit and 32bit system

是否有任何原因导致在64位系统上完美运行的c ++程序在32位系统上崩溃? 我有一个在2个服务器上测试过的程序。 一个是64位,另一个是32位。 该程序没有位特定的命令。 最初,它在两种情况下都起作用,直到我进行修改并添加了一个结构并将其命名。 第一次调用此结构对象时,程序崩溃。 但是,如果我在崩溃之前打印元素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;

一个简单的原因是未定义的行为。

只是一个猜测。 您是否在64位计算机上/针对64位计算机进行了编译? 可能是其中有些操作码在32位计算机中不可用。

因此,在32位版本而不是64位版本中,没有强制转换,没有动态分配和崩溃。 我的第一个猜测是访问其范围之外的数组。

有很多事情可能出错,而且如果没有调试器,这将是一场噩梦。

选项1:说服对服务器具有管理员权限的任何人来安装gdb

选项2:在各处添加打印语句,以准确找出段错误发生在此处的那一行(或尝试自行找出该行)。

您正在将整数添加到char数组中:

string first_id = "idOne : " + (*i).second.id1; 
string second_id = "idTwo: " + (*i).second.id2;

可能是因为您的测试集有所不同,并且在非投掷系统上,您意外地获得了有效的地址来分配给字符串变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM