2013-02-26 46 views
-1

代碼看起來是這樣的:Ç - 連續釋放calloc調用腐敗一些內存

char *global1 = NULL; 
char *global2 = NULL; 
char *global3 = NULL; 
char *global4 = NULL; 

void func2(char *gPtr, char **gPtrToInitialize) 
{ 
    if(*gPtrToInitialize == NULL)      // Here, gPtr is correct 
    { 
     *gPtrToInitialize = dlcalloc(MAX_PATH, 1);  
    }        // Here, gPtr has trailing junk characters 

    // Do some initialization 
} 

void func1() 
{ 
    if(global1 == NULL) 
    { 
     global1 = dlcalloc(MAX_PATH, 1); 
    } 
    func2(global1, &global2); 
    func2(global1, &global3); 
    func2(global1, &global4); 

    // Do other tasks 

    // Free all allocated global variables 
} 

注: 在上面的代碼,dlcalloc指Doug Lea的malloc.c定義的代碼。


callocfunc2()

gPtr = 「C:\ Program Files文件\測試\ Path.txt」 以前callocfunc2()

gPtr =「C:\ Program Files \ Test \Path.txt♂」


我的問題是,做連續dlcalloc()呼叫具有破壞其他一些變量的內存很小的機率?上面的代碼是我正在處理的某個大代碼庫的一部分的泛化。

回答

1

好吧,我剛剛解決了我的問題。這是發生了什麼事在func2()

  • gPtr指出0x009b0038
  • strlen("C:\Program Files\Test\Path.txt") = 30字節。
  • *gPtrToInitialize上分配指向0x009b0057其中gPtr的段落結束後開始剛好
  • 由於gPtr指向的字符串沒有尾隨'\ 0',因此gPtr上的任何字符串操作實際上也都進入了*gPtrToInitialize的內存。

所有時,我只是簡單地添加一個尾隨'\0'這得到了解決。

感謝您的所有答案!

0

dlcalloc不應該有任何損壞內存的任何其他部分的機會,除非它有一個錯誤(這是不可能的)。它應該工作或失敗,但不應該損壞任何東西。

我認爲你應該看看你對指針的使用,因爲在上面的代碼中,你將global2,global3和global4的地址傳遞給func2。這些地址不應該爲空,所以調用func2中的dlcalloc應該永遠不會發生。

我懷疑FUNC2應該是這樣的:

void func2(char *gPtr, char **gPtrToInitialize) 
{ 
    if(*gPtrToInitialize == NULL)      // Here, gPtr is correct 
    { 
     *gPtrToInitialize = dlcalloc(MAX_PATH, 1);  
    }        // Here, gPtr has trailing junk characters 

    // Do some initialization 
} 

我會看在你對它們更可能導致內存損壞類似指針錯誤代碼的其他地方。

C指針是危險的。