【发布时间】:2012-04-04 23:48:21
【问题描述】:
我一直试图让这段代码工作但没有成功。 gdb 告诉我 void Compiler::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->代码所代表的类的定义。
/// 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() 永远不会运行。
任何人都可以看到导致这个神秘的段错误的错误吗?
提前致谢。
【问题讨论】:
-
代码太多。在此处发布您的代码之前,您需要构造一个minimal test-case。但是你确定吗?
this->code是一个有效的指针吗? -
@OliCharlesworth 我比较确定它是一个有效的指针,因为我调用其他虚拟成员没有问题。
-
@64bit_twitchyliquid:你需要先构建一个最小的测试用例,然后这里的任何人才能给你具体的帮助。
-
@64bit_twitchyliquid: “相当肯定” 告诉我它可能不是。
标签: c++ class segmentation-fault virtual