簡體   English   中英

當CPU是32位處理器時,以下代碼中的內存丟失

[英]Memory loss in following code when the CPU is 32 bit processor

我有一個將整數轉換為字符串的函數。

char * Int_String(int Number)
{
    char* result;
    NAT   size = 1;

    if (Number > 9) {
        size = (NAT)log10((double) Number) + 1;
    } else if (Number < 0) {
        size = (NAT)log10((double) abs(Number)) + 2; /* including '-' */
    }
    size++; /* for '\0' */

    result = (char *) memory_Malloc(sizeof(char) * size);
    sprintf(result, "%d", Number);
    return result;
}

NATtypedef unsigned int

Numberint

我以以下方式使用此功能

char *s2;
char **Connections;
Connections = memory_Malloc(nc*sizeof(char*));
char con[]="c_";
k1=1;
for (i=0; i<nc ; i++){
    s2 = Int_ToString(k1);
    Connections[i]= string_Conc(con,s2);  
    string_StringFree(s2);     
    k1= k1+1;
}   

並且函數char* string_Conc(const char *s1, const char *S2)

{ 
    char* dst;

    dst = memory_Malloc(strlen(s1) + strlen(s2) + 1);
    strcpy(dst, s1);
    return strcat(dst,s2);
}

我正在使用以下方法釋放其內存:

for(i=0; i<nc; i++){
    memory_Free(Connections[i],sizeof(char));
}
memory_Free(Connections,nc*sizeof(char*));

我遇到的問題是:當nc<=9時,我可以釋放所有分配的內存。但是當它>=10等於>=10時,內存泄漏會以4字節的倍數增加,每次增加。 我該如何解決這個問題。我們將不勝感激。

編輯

  void memory_Free(POINTER Freepointer, unsigned int Size)

謝謝,西娜

您沒有顯示memory_Free的實現(兩者都不是memory_Malloc ),所以我們不知道為什么需要傳遞要釋放的內存塊的假定大小作為第二個參數(標准的free()不需要這個) )。 但是這里

memory_Free(Connections[i],sizeof(char));

這肯定是錯誤的: 在大多數平台上 sizeof(char)為1,但是數組中每個字符串的已分配塊的大小至少為4個字節(因為字符串包含“ c_”加上至少一位數字加上終止符' \\ 0')。

更新資料

查看鏈接的源代碼,這確實是造成問題的原因! memory_Free內部的代碼似乎使內存塊大小對齊-我可以假設這是4字節邊界,這很常見。 在這種情況下,如果傳遞的Size為1,則恰好將其校正為4-如上所示,如果是一位數字,則恰好是正確的值! 但是,大於9的數字將轉換為(至少)兩位數字,因此轉換后的字符串的大小已經為5。一個5字節的塊很可能在memory_Free分配為8字節的對齊塊-但由於memory_Free始終以1的Size調用它,它總是只釋放4個字節。 就像您在上面的評論中所描述的那樣,每個9以上的數字都會泄漏4個字節!

要解決此問題,您需要將上面的行修改為

memory_Free(Connections[i], strlen(Connections[i]) + 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM