Ich habe versucht, dieses Bit Code ohne Erfolg zu arbeiten. gdb sagt mir, dass es eine segfault irgendwo im leeren Raum Compiler :: GenerateCode_ToFile (char * filename) Funktion, und ich habe das Problem manuell zu irgendwo in der Linie verfolgt:Crash/Segfault beim Aufruf des virtuellen Members der Unterklasse
std::string tempfile = this->code->CodeGen(temp, AST_TYPE_UNDEF, symtab, 0);
aber nicht, nachdem er oder sie vor . Außerdem scheint es zu stürzen, bevor irgendein Code dieser virtuellen Funktion ausgeführt wird.
Kann jemand das Problem hier sehen? Ich kann nicht sehen, was es zum Absturz bringt. Diese ist die Funktion, die virtuelle Funktion aufruft:
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();
}
Dies ist die Definition der Klasse von this- vertreten> 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);
};
Dies ist seine Superklasse:
/// 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;};
};
und schließlich ist dies die virtuelle Funktion, die aufgerufen wird (obwohl vor scheint zum Absturz bringen es ausgeführt wird):
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;
}
I Ich weiß, dass es abstürzt, bevor es ausgeführt wird, da Sleep() nie ausgeführt wird.
Kann jemand den Fehler sehen, der diesen mysteriösen segfault verursacht?
Vielen Dank im Voraus.
Zu viel Code. Sie müssen einen [minimalen Testfall] erstellen (http://sscce.org), bevor Sie Ihren Code hier veröffentlichen. Sind Sie sicher, dass z. 'this-> code' ist ein gültiger Zeiger? –
@OliCharlesworth Ich bin relativ sicher, dass es ein gültiger Zeiger ist, da ich andere virtuelle Mitglieder ohne Probleme anrufe. –
@ 64bit_twitchyliquid: Sie müssen einen minimalen Testfall konstruieren, bevor jemand hier Ihnen konkrete Hilfe geben kann. –