我遇到了分段錯誤,我找不出原因。我有一個全局的TcpClient對象,它有一個指向一個Agent對象的指針。我試圖在發生分段錯誤時訪問函數中的代理指針。主要的是,我在TcpClient中設置代理成員之前和之後都有cout語句,並且這兩個語句都給了我相同的地址。全局變量seg故障
TcpClient client((char*)PORT);
Agent* agent = new Agent;
int main(int argc, char* args[]) {
//initialization code for agent's members
cout<<"\nagent: "<<agent;
client.setAgent(agent); //set it here
cout<<"\nclient agent: "<<client.getAgent()<<"\n";
}
然後我在這個TcpClient的功能獲取運行中調用(設置路線的代理後)。當我嘗試訪問代理時,出現分段錯誤。在開始時我有一個cout語句,告訴我代理是0x0。
void TcpClient::getCommand(char* command) {
std::cout<<"\nagent: "<<agent;
}
的setAgent是一個典型的二傳手 -
void TcpClient::setAgent(Agent*& a) {agent = a;}
class Agent;
class TcpClient {
//functions and stuff
private:
Agent* agent;
};
代理成員的代碼不訪問任何其他地方。我能想到的唯一的事情是TcpClient對象是全局的,可以做到這一點,但我不知道是什麼。我對嗎?任何幫助表示讚賞。
當我運行代碼,調試器說 -
Program received signal SIGSEGV, Segmentation fault.
__memcpy_ssse3_rep() at ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S:1454
1454 ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S: No such file or directory.
in ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S
(gdb) back
#0 __memcpy_ssse3_rep()
at ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S:1454
#1 0x08049c52 in Agent::setGoal (this=0x0, g=...) at agent.cpp:33
#2 0x0805075e in TcpClient::getCommand (this=0x805aac8,
command=0xbffff18d "1 3 1\n") at tcpclient.cpp:80
#3 0x08050b8d in TcpClient::communicate (this=0x805aac8) at tcpclient.cpp:153
#4 0x0804e0f8 in main (argc=1, args=0xbffff3f4) at mainclient.cpp:119
當你不需要時不要使用'new'。不要使用全局變量。不要使用char *'。使用調試器查看段落髮生的位置。 –
'Agent * agent = new Agent'在哪裏/何時被調用? – Mat
這就是int main()函數之上的主文件。 – Sterling