我在Code Blocks中运行了一个c ++程序,但是我得到了错误: “流程终止,状态为-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.
这意味着我之前提到的那条线有问题,但我无法弄清楚原因。有人能告诉我这里我做错了什么吗?
答案 0 :(得分:0)
到目前为止,我很惊讶;当我尝试运行程序时,它实际上更早挂起。原因如下:
您的主要功能会在add_transition(0, ...)
之后调用add_state(0)
来调用cout << "Gaat dit goed?" << endl;
。
此时,在add_state
内,if(state >= number_of_states)
评估为true(if(0>=0)
),然后调用new
分配0 transition*
个元素,这是一件可能导致错误的坏事(C++ new int[0] -- will it allocate memory?)。无论如何,在这种情况下,你的错误不在这里。接下来,您现在跳过for
循环,因为条件不满足,直接转到free_action_table();
。
在其中,您跳过for
(同样的原因),然后......您尝试delete[] action_table;
。
action_table
何时初始化?决不!因此它具有随机值。如果您尝试删除它,您很可能会访问一个不为您的进程保留的地址,并获得一个很好的分段错误。你显示的输出表明你超越了这个,所以你(幸运地)有幸得到一个实际上与你的程序的内存空间相对应的随机值,因此它没有在你第一次到达它时抛出分段错误。
因此,为了解决您的问题(虽然我不能保证它是唯一的一个),您必须在删除之前初始化该指针,或者在尚未初始化时必须避免删除它。您可能还会看一下智能指针,它们可以处理内存管理并防止这些错误。