2013-02-15 38 views
0

我在iPhone應用程序中使用了一個c lib。 c lib是由我無法訪問的人編寫的。iphone ansi c:被釋放的指針未被分配

但是我得到的錯誤,對象0xa6000d被釋放,但沒有分配。調試變量截圖在這裏。

enter image description here

結構GtsMsg被定義爲,

struct msg { 
    int offset; 
    int dataLength; 
    u8* data; 
    cBool expandable; 
    cBool owned; 
    u8* mid2key; 
}; 

#define GtsMsg struct msg 


void freeMessageData(GtsMsg* msg) { 
    if (msg == NULL) return; 
    if (msg->owned) { 
     if (msg->data != NULL) { 
      free(msg->data); 
     } 
    } 
    free(msg->mid2key); 
    memset(msg, 0, sizeof(GtsMsg)); 
} 

爲malloc_error_break斷點是線自由(MSG->數據)。

我已經添加了檢查是否(msg-> data!= NULL),但它沒有工作。有什麼方法來檢查msg-> data或msg的內存是否被分配?

你以爲* data =(u8)'\ 0'有什麼可疑的嗎?

在此先感謝!

+1

當您分配結構時,您是否將其指針成員的有效值(指向已分配內存的指針或NULL)? – simonc 2013-02-15 11:37:42

+0

這也是我的想法。該結構用於某些目標c和cpp類。未明確初始化。但它適用於所有情況。我只是在一個特殊的情況下,當應用程序崩潰。 – karim 2013-02-15 11:40:13

+4

這將是你的問題。指針成員必須被初始化。你可以通過使用calloc來填充內存零位,(2)手動設置指針指向已分配的內存,(3)通過手動將指針設置爲NULL來完成此操作(1)。任何沒有這些功能的代碼只是偶然的工作,並且很容易在將來中斷 – simonc 2013-02-15 11:42:39

回答

0

感謝大家的建議。 感謝hmjd提示。

我發現結構被用在cpp類中,析構函數調用freeMessageData。但我無法找到結構已初始化。所以,如果我在聲明中將結構初始化爲NULL,這就避免了可用內存問題,並且不會崩潰。

它由simonc建議的東西。如果他寫這個答案不是,評論,我可以接受。

hmjd意見,

爲NULL的檢查是無用的免費()將是一個空操作,如果指針 傳遞給爲NULL。僅僅因爲指針不是NULL並不意味着它指向一個有效的內存位置(內存可能已經被釋放了 或指針從未初始化爲NULL)。編程人員有責任在嘗試釋放指針之前確保指針的有效性爲 。

相關問題