私はこのコードをうまく機能させようとしてきました。gdbは、voidCompiler :: GenerateCode_ToFile(char * filename)関数のどこかにセグメンテーション違反があることを教えてくれます。問題を手動で次の行のどこかにトレースしました。
std::string tempfile = this->code->CodeGen( temp, AST_TYPE_UNDEF, symtab, 0);
しかし、その後や前ではありません。また、その仮想関数のコードが実行される前にクラッシュするようです。
誰かがここで問題を見ることができますか?何が原因でクラッシュするのかわかりません。これは、仮想関数を呼び出す関数です。
void Compiler::GenerateCode_ToFile(char* filename){
char directory[MAX_PATH]; //Actually represents the full path.
strcpy( directory, this->cwd.c_str());
strcat( directory, filename);
if(this->isVerboseMode)
std::cout << "Source Output: " << directory << '\n';
std::fstream file( directory, std::ios::out);
int* temp = new int;
Symtable* symtab = new Symtable;
file << emit_core_code();
file << "\n\n";
std::string tempfile = this->code->CodeGen( temp, AST_TYPE_UNDEF, symtab, 0);
file.close();
}
これは、this->codeで表されるクラスの定義です。
/// CollectionExprAST - Expression class for multiple branches.
class CollectionExprAST : public ExprAST {
std::vector<ExprAST*>* Code;
public:
CollectionExprAST(std::vector<ExprAST*>* code) : Code(code) {}
virtual std::string CodeGen(int* GeneratedCodeOpType,int WantOpType,Symtable* symtab, int depth);
int GetType(void){return AST_TYPE_COLLECTION;};
void* GetCollection(void){return this->Code;};
void DebugPrint(int level);
};
これはそのスーパークラスです:
/// ExprAST - Base class for all expression nodes.
class ExprAST {
public:
virtual ~ExprAST() {}
virtual std::string CodeGen(int* GeneratedCodeOpType,int WantOpType,Symtable* symtab, int depth) {return std::string("");};
virtual void DebugPrint(int level){return;};
virtual int GetType(void){return AST_TYPE_UNDEF;};
virtual void* GetCollection(void){return NULL;};
};
そして最後に、これは呼び出されている仮想関数です(実行される前にクラッシュするように見えますが):
std::string CollectionExprAST::CodeGen(int* GeneratedCodeOpType,int WantOpType,Symtable* symtab, int depth)
{
Sleep(3000);
std::string ret;
int j=0;
for(;j<this->Code->size();j++){
int temp;
int i=0;
for(;i<depth;i++)
ret += "\t";
ret += (*this->Code)[j]->CodeGen(&temp,WantOpType,symtab, depth+1);
ret += '\n';
}
return ret;
}
Sleep()は実行されないため、実行前にクラッシュすることはわかっています。
この不思議なセグメンテーション違反を引き起こしているバグを誰かが見ることができますか?
前もって感謝します。