Я пытался заставить этот бит кода работать без успеха. GDB говорит мне, что есть где-то в выдаёт ошибку сегментации недействительного Compiler :: GenerateCode_ToFile (символ * имя_файла) функция, и я вручную проследили проблему где-то в строке:Crash/Segfault при вызове виртуального члена подкласса
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-> кода.
/// 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;
}
I знайте, что он сработает, прежде чем он запустится, потому что Sleep() никогда не запускается.
Может ли кто-нибудь увидеть ошибку, вызывающую этот таинственный segfault?
Заранее спасибо.
Слишком много кода. Вам необходимо создать [минимальный тестовый сценарий] (http://sscce.org), прежде чем размещать здесь свой код. Но вы уверены, что, например, 'this-> code' является допустимым указателем? –
@OliCharlesworth Я относительно уверен, что это действительный указатель, так как я называю других виртуальных членов без проблем. –
@ 64bit_twitchyliquid: вам нужно построить минимальный тестовый пример, прежде чем кто-нибудь здесь сможет вам помочь. –