Code Blocks run error: "Process terminated with status -1073741510". What am I doing wrong?

Code Blocks run error: "Process terminated with status -1073741510". What am I doing wrong?

我是 运行 Code Blocks 中的 c++ 程序,但出现错误: "Process terminated with status -1073741510"。 到目前为止,我发现错误发生在:

new_list = new char[number_of_symbols + 1];

问题是我一辈子都弄不明白我做错了什么。为了提供更多上下文,我将完整的代码放在下面。

#include <iostream>
#include <math.h>
#include <time.h>

using namespace std;

struct transition{
  int write_symbol;
  int move_head;
  int next_state;
};

class TM{
public:
  TM();
  ~TM();
  void add_transition(int, char, int, char, int);
  void remove_transition(int, char);
  void run();
  void run(char*, int);
private:
  int current_state;
  int head_position;
  int number_of_states;
  int number_of_symbols;
  char* symbol_list;
  transition** action_table;
  void add_state(int);
  int add_symbol(char);
  void print(char*);
  void free_action_table();
};

TM::TM(){
  number_of_states = 0;
  number_of_symbols = 0;
}

TM::~TM(){
  free_action_table();
}

void TM::add_transition(int p, char sigma, int q, char tau, int D){
  int symbol_id1, symbol_id2;
  cout << "Gaat dit goed?" << endl;
  add_state(p);
  cout << "Gaat dat goed?" << endl;
  add_state(q);
  cout << "En gaat deze goed?" << endl;
  symbol_id1 = add_symbol(sigma);
  cout << "Gaat die ook goed?" << endl;
  symbol_id2 = add_symbol(tau);
  cout << "Gaat misschien alles goed?" << endl;
  action_table[symbol_id1][p].write_symbol = symbol_id2;
  action_table[symbol_id1][p].next_state = q;
  action_table[symbol_id1][p].move_head = D;
  cout << "Alles gaat goed!" << endl;
}

void TM::add_state(int state){
  transition** new_table;
  if(state >= number_of_states){
    new_table = new transition*[number_of_symbols];
    for(int i = 0; i < number_of_symbols; i++){
      new_table[i] = new transition[state + 1];
      for(int j = 0; j < number_of_states; j++){
        new_table[i][j] = action_table[i][j];
      }
      for(int j = number_of_states; j <= state; j++){
        new_table[i][number_of_states - 1].write_symbol = -1;
        new_table[i][number_of_states - 1].next_state = -2;
        new_table[i][number_of_states - 1].move_head = 0;
      }
    }
    free_action_table();
    number_of_states = state + 1;
    action_table = new_table;
  }
}

int TM::add_symbol(char symbol){
  transition** new_table;
  char* new_list;
  cout << "Gaat hier iets fout?" << endl;
  for(int i = 0; i < number_of_symbols; i++){
    if(symbol_list[number_of_symbols] == symbol){
      return i;
    }
  }
  new_table = new transition*[number_of_symbols + 1];
  cout << "Gaat daar iets fout?" << endl;
  new_list = new char[number_of_symbols + 1];
  cout << "Of misschien hier?" << endl;
  for(int i = 0; i < number_of_symbols; i++){
    new_table[i] = new transition[number_of_states];
    new_list[i] = symbol_list[i];
    for(int j = 0; j < number_of_states; j++){
      new_table[i][j] = action_table[i][j];
    }
  }
  for(int j = 0; j < number_of_states; j++){
    new_table[number_of_symbols][j].write_symbol = 0;
    new_table[number_of_symbols][j].next_state = -2;
    new_table[number_of_symbols][j].move_head = 0;
  }
  cout << "Zou het kunnen?" << endl;
  new_list[number_of_symbols] = symbol;
  free_action_table();
  if(number_of_symbols > 0){
    delete[] symbol_list;
  }
  symbol_list = new_list;
  number_of_symbols++;
  action_table = new_table;
  cout << "Alles gaat goed!" << endl;
  return number_of_symbols - 1;
}

void TM::free_action_table(){
  for(int i = 0; i < number_of_symbols; i++){
    delete[] action_table[i];
  }
  delete[] action_table;
}

int main(){

  TM one = TM();
  one.add_transition(0,'0',0,'1',0);
  one.add_transition(0,'1',-1,'1',0);

  return 0;
}

在 运行 之后我得到以下输出:

Gaat dit goed?
Gaat dat goed?
En gaat deze goed?
Gaat hier iets fout?
Gaat daar iets fout?
Of misschien hier?
Zou het kunnen?
Alles gaat goed!
Gaat die ook goed?
Gaat hier iets fout?
Gaat daar iets fout?

Process returned -1073741819 (0xC0000005)   execution time : 2.028 s
Press any key to continue.

这意味着我之前提到的那行有问题,但我不明白为什么。有人能告诉我我做错了什么吗?

我很惊讶你能走到这一步;当我尝试 运行 该程序时,它实际上挂起得更早。原因如下:

您的主函数调用 add_transition(0, ...),后者调用 add_state(0),就在您的 cout << "Gaat dit goed?" << endl;.

之后

此时,在add_state里面,if(state >= number_of_states)求值为真(就是if(0>=0)),然后你调用new分配0transition*元素,这是一件坏事,可能会导致错误 (C++ new int[0] -- will it allocate memory?)。无论如何,在这种情况下,您的错误不在这里。继续,你现在跳过 for 循环,因为条件不满足,直接进入 free_action_table();.

在其中,您跳过 for(同样的原因),然后...您尝试 delete[] action_table;

action_table 什么时候初始化的?绝不!因此它具有随机值。如果你试图删除它,你很可能会访问一个没有为你的进程保留的地址,并得到一个很好的分段错误。您显示的输出表明您超出了那个范围,所以您很(不)幸运地拥有一个实际对应于您的程序内存的随机值 space,因此它不会在您第一次到达时抛出分段错误它。

因此,要解决您的问题(虽然我不能保证它是唯一的问题),您必须在删除它之前初始化该指针,或者您必须避免在它尚未初始化时删除它。您也可以看看智能指针,它们可以负责内存管理并防止这些错误。