2011-04-21 80 views
0

我使用星號簽署了造成問題的兩行。在linux中分配內存的問題

第一行爲日誌文件分配內存,該內存將用於第二個已簽名的行。 在第二個簽名行存在分段錯誤問題。 這是由於「日誌文件」未分配的事實造成的。 我很確定這是因爲如果我在load()中分配內存,它會起作用。 但是我想在類的構造函數中分配內存,而不是在方法load()中分配內存。

我不明白爲什麼它不起作用! 這是我第一次在Linux上,所以也許我做錯了什麼!

謝謝 馬爾科

server::server(){ 
    port = 0; 
    serverup = 0; 
    loaded = 0; 
    logfile = (char *) malloc(SERVER_PATHS_SIZE*sizeof(char)); //**************************** 
} 

int server::load(int in_id, char *in_name, char *in_ip, int in_port, 
       char *in_rcon, char *in_logfile){ 

    int err; 

    sprintf(name, "%s\x00", in_name); 
    sprintf(ip, "%s\x00", in_ip); 
    port = in_port; 
    sprintf(rcon, "%s\x00", in_rcon); 
    sprintf(logfile,"%s\x00", in_logfile); //********************************** 

    err = urt.set(ip, port, rcon); 
    if(err < 1){ 
     printf("server::load(): error from urt.set()\n"); 
     return 0; 
    } 

    printf("server::load(): server %d loaded!\n", id); 
    loaded = 1; 

    return 1; 
} 
+2

請將您的代碼縮減爲可用於演示問題的可運行(即可編譯,可運行)示例。否則,我們只能猜測問題出在哪裏... – sleske 2011-04-21 12:06:21

+0

我們看不到'logfile'在哪裏聲明。它是類服務器的成員變量嗎?它是全球性的嗎?讓你的例子獨立編譯對調試至關重要。 – DevSolar 2011-04-21 12:20:25

+0

當編程C++時,'new'通常比'malloc'更受歡迎 – knittl 2011-04-21 12:26:28

回答

0
  1. 我沒有看到服務器類的析構函數。你有一個釋放內存的析構函數嗎?

  2. 我沒有看到創建和使用服務器對象的代碼。是否可以創建服務器對象,然後創建它的副本,並且因爲沒有正確實現複製語義而出現問題?

+0

(2)不,它不能,因爲(1)。 :) – 2011-04-21 12:41:30

+0

黑暗的獵鷹,你是一個天才!這是問題!非常感謝! – Marco 2011-04-22 01:36:05

+0

基本上沒有調用構造函數......可能我是以錯誤的方式創建服務器對象! 感謝所有的答覆! – Marco 2011-04-22 01:39:29

4

我認爲你正試圖nullterminate in_logfilein_rcon

因爲printf的需要擺在首位null結尾的字符串作爲參數%s的這不會printf的工作。

charptr[known_length] = 0 

代替

+1

爲了稍微說明一下,出現了段錯誤,因爲原始輸入到'sprintf'中缺少空終止導致數據通過原始輸入的末尾被讀取,導致無效讀取。此外,你然後試圖分配更多的數據到輸出數組比你想象的,導致無效的寫入。 – 2011-04-21 12:40:29

1

這絕對不是一個答案,但在C++深化發展將幫助你避免你和你的C-與類代碼獲取內存問題。

使用std :: strings,然後複製它們將是微不足道的(與sprintf相比),它會更安全。使用棄用的char *會讓事情變得混亂。

一個不錯的副作用是,您不需要手動分配內存(使用malloc或new),並消除任何內存泄漏風險。

+0

不推薦使用'char *'來處理字符數組。 (儘管將字符串字面值綁定到char *而不是char const *)。 – 2011-04-21 12:41:04