2011-07-24 200 views
0

我遇到了分段錯誤,我找不出原因。我有一個全局的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 
+2

當你不需要時不要使用'new'。不要使用全局變量。不要使用char *'。使用調試器查看段落髮生的位置。 –

+0

'Agent * agent = new Agent'在哪裏/何時被調用? – Mat

+0

這就是int main()函數之上的主文件。 – Sterling

回答

1

我有一個叫通信功能(這只是讓服務器和客戶端相互交談)調用getCommand功能我張貼以上。在我調用getCommand之前,有一個本地char *的memset調用。我所做的只是刪除該行,並且分段錯誤消失。

感謝您的幫助。

+0

原本是一個評論,因爲我沒有足夠的代表回答,但想我會繼續做它的答案,所以我可以接受。 – Sterling

1

你應該閱讀編譯器/連接警告,我相當肯定它會在你不明的名字被拋出一些。

如果您之前已將其定義爲全局成員,則不要將「agent」用作類成員的變量名稱;使用像private: Agent* myAgent;(當然改變setAgent使用它),你應該希望找到問題消失。

此外,* &基本上自行抵消了;私有成員是一個指針,所以你應該在set方法中使用一個指針 - 我懷疑你的segfault是因爲它認爲是一個指針而實際上不是一個錯誤的操作,反之亦然。

+0

我編譯它時沒有收到任何警告。不幸的是,這並沒有幫助我現在的問題,但我會在未來的計劃中記住這一點。 – Sterling

+0

也,你爲什麼用'的TcpClient :: setAgent(代理*&A)' - 私有成員是一個指針,所以它應該僅僅是'代理*了' - 請還顯示'的TcpClient :: getAgent代碼() ' – Olipro

+0

代理*的TcpClient :: getAgent(){回報myAgent;} – Sterling

0

void TcpClient::setAgent(Agent*& a) {agent = a;}寫作意圖,還是你的意思是Agent *a

如果你傳遞一個Agent對象,語法是Agent &a,意爲「a是通過Agent對象的地址。」

如果你傳遞一個指針(你在這裏做什麼它),語法是Agent *a,這意味着「a作爲一個(可能爲null)指針,Agent傳入的對象。」

+0

好吧,Agent * a會傳遞一個Agent對象的地址,因爲這是指針所包含的地址。代理&A將通過一個實際的代理變量的TcpClient的,如果你想要的TcpClient代理指向同一個對象,你仍舊需要通過調用'代理獲得的存儲位置=&A;'。 –

+0

我的意思是這樣。我的理解是,我傳遞的是一個指針的引用,而不僅僅是一個副本。所以當我訪問指針並改變它時,它在其他地方也會發生變化。 – Sterling

+0

什麼OP做的是傳遞給一個指針引用,所以他對他傳遞的實際指針變量的句柄。如果他想,他可以改變什麼點,它也將改變全球代理變量是什麼指向,但那不是正在做什麼,所以似乎沒有必要。 'setAgent(Agent * a)'應該就足夠了。 –