2012-08-16 105 views
-1

我的一個C++程序(這裏是源代碼:https://github.com/dermesser/libsocket)有一個非常大的和奇怪的問題。有一個基類(C++/socket.cpp中的套接字),一個(虛擬)派生類(unix_socket,C++/unixbase.cpp中)和一個「葉」類( unix_stream_server)。數據成員「sfd」在「套接字」(socket.cpp)中聲明並初始化。但是,在unix_stream_server :: setup(C++/unixserverstream.cpp)中,「sfd」具有完全不同的值。有點調試輸出:基類構造函數和數據成員初始化的奇怪行爲

socket constr -1 # <--- "socket" constructor 
unix_socket constr - sfd: 1447345536 # <---- unix_socket constructor 
setup final: 1447345536 # <--- unix_stream_server::setup 
unixserverstream.cpp:76: unix_stream_server::setup: Socket already set up! 

最後一行是由異常傳遞的錯誤消息。調試程序給出了相同的結果。

奇怪的是,變量的價值差異很大,我不明白爲什麼。在具有相似繼承路徑的兄弟類中,這個問題不存在。

編輯1:如果我重新分配「sfd」,問題甚至不會消失。它只是保持在同樣奇怪的價值。

有些問題我消除的東西我想:

  • 定義/聲明不匹配(我知道,這是很奇怪在這個軟件)
  • 把「SFD」公衆區域

還有什麼可能的問題:如果我通過靜態或動態鏈接程序(它是示例++/unix_server_stream.cpp)(針對Makefile生成的SO)存在問題。

,我渴望:(有沒有人有這樣的問題,想法或經驗,還是我太累了,找到解決方案

編輯2:?這很難張貼代碼,我認爲這是更好,如果你遵循。我提示github存儲庫中的文件,因爲我不知道應該發佈哪一部分。:|對不起......(請不​​要以爲我希望你爲我工作 - 只是很難選擇正確的代碼)

unix_stream_server ::設置():

if (sfd != -1) 
     throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Socket already set up!\n"); 
if (path == NULL) 
     throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Path is NULL!\n"); 

    sfd = create_unix_server_socket(path,STREAM,flags); 

    _path.assign(path); 

if (sfd < 0) 
     throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Error at creating UNIX stream server socket!\n"); 
+1

郵政編碼,而不是詞:-) – 2012-08-16 20:06:04

+0

我會說'sfd'未初始化,基於值。 – 2012-08-16 20:24:03

+0

如果你明確地調用子類構造函數中的父類構造函數(例如'unix_socket :: unix_socket(void):socket :: socket(),_path(「」){}''和'unix_stream_server'類似)幫幫我? – 2012-08-16 20:28:45

回答

0

ÿ我們的標題在class unix_stream_server的定義中有bool listening,但是您的.cpp文件有另一個class unix_stream_server的定義,它省略了bool listening成員。不要這樣做。嚴重的是,不要這樣做。從你的實現文件中包含你的頭文件!請!

+0

非常感謝:D這就像我說的,太累了找不到這樣的錯誤。是的,我會用雙重聲明來改變這種情況,這是我有過的最糟糕的想法,而且我已經遇到了幾個問題。 :) – dermesser 2012-08-17 07:28:19

+0

最好的問題是SIGSEGV,因爲虛擬基類聲明不匹配:P – dermesser 2012-08-17 07:34:42

相關問題