整数增量会导致应用程序崩溃

时间:2012-03-27 00:54:13

标签: c++

我正在尝试逐行读取文件,并将该行数据存储在名为“command”的对象中(其中包含有关机器人对象可以理解的指令的信息)

这是读取函数(C ++):

int robot::readfile(const char fname[]) {
    FILE *rf;
    rf = fopen(fname, "r");

    if (rf != NULL) {
        int idx = 0;
        char record[161];

        while ((this->cmd_count < this->cmd_size)
               && (fgets(record, 160, rf) != NULL)) {
            command tmp_cmd(record);
            this->cmds[idx++] = tmp_cmd;
        }
    } else {
        perror(fname);
    }

    fclose(rf);
    return 1;
}

基本上,在上面的代码中,当我尝试将变量“idx”递增1(使用语法:idx ++)时,它基本上只是崩溃了应用程序。

任何想法为什么?

编辑: 正如评论者所要求的那样:

void robot::cmd_malloc(int size) {
    // most likely will cause problems if size is below 1.
    if (size < 1) {
        return;
    }

    try {
        this->cmds = new command[size];
        this->cmd_size = size;
        this->cmd_count = 0;
    } catch (std::bad_alloc) {
        // bad allocation exception.
        this->cmds = NULL;
        cout << "bad_alloc:" << (sizeof(command) * size) << " in 'robot::cmd_malloc'." << endl;
    }

}

1 个答案:

答案 0 :(得分:3)

你没有在循环中递增cmd_count,这意味着在某些时候idx会变得大于cmd_size,导致程序崩溃。

编写代码的C ++样式是使用:

  • std::vector<command>而不是new command[size]。如果您使用std::vector,那么您不必自己进行内存管理,而且您不必维护另外两个变量cmd_sizecmd_count,因为vector本身通过{{{{}}提供这些信息。分别为1}}和size()成员函数。

  • capacity()而不是std::ifstream。在循环中读取输入时,您应该使用FILE*而不是std::string,尽管我确定此部分,因为我不知道具体是什么您尝试从流中读取的数据。