2013-05-08 36 views
1

世界,你好(HI人),ÇVS2010 - 堆損壞釋放指針數組結構

首先,我會說這是我的第一篇文章,所以請手下留情。
正如標題所說,當我想釋放我的對象時,我有一堆腐敗。我花了幾個小時試圖修復它,但即使我確定它很明顯,我也看不出有什麼問題!
所以這就是我來找你的原因。

我的目標是創建一些函數來(模糊地)模仿c中的某些std :: vector函數。所有對象都是動態創建的。由於大量使用指針,實現可能會非常棘手。
我得到了堆腐敗,當我釋放矢量對象,但我不知道它是否來自pushBack或銷燬功能。
隨時問更多的信息。建設性意見是值得歡迎的!

下面是一些一段代碼:

部首內容:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

typedef struct _array 
{ 
    unsigned int size; 
    int *pData; 
} tArray, *ptArray; 

typedef struct _vector 
{ 
    unsigned int size; 
    ptArray *pData; 
} tVector, *ptVector; 

ptArray createArray(unsigned int size); 
void destroyArray(ptArray *pArray); 

ptVector createVector(); 
int pushBackArray(ptVector pVector, ptArray pArrayToAppend); 
int popBackArray(ptVector pVector); 
void destroyVector(ptVector *pVector); 

主要內容:

int main(char argc, char *argv[]) 
{ 
    unsigned int size = 5, i; 
    time_t seed = NULL; 
    ptArray pArr = createArray(size); 
    ptVector pVec = createVector(); 

    srand(seed); 

    for(i = 0; i < pArr->size; i++) 
    { 
     pArr->pData[i] = rand() % 9 + 1; 
    } 

    //destroyVector(&pVec); // Works at this point 

    pushBackArray(pVec, pArr); 

    destroyArray(&pArr); 
    destroyVector(&pVec); // Heap corruption on free pVector->pData 

    getchar(); 
    return 0; 
} 

體含量:

ptArray createArray(unsigned int size) 
{ 
    ptArray pArray = (ptArray)calloc(1, sizeof(tArray)); 

    if(pArray) 
    { 
     pArray->pData = (int*)malloc(size * sizeof(int)); 

     if(pArray->pData) 
      pArray->size = size; 
    } 

    return pArray; 
} 

void destroyArray(ptArray *pArray) 
{ 
    if(pArray) 
    { 
     free((*pArray)->pData); 
     free((*pArray)); 
     (*pArray) = NULL; 
    } 
} 

ptVector createVector() 
{ 
    ptVector pVector = (ptVector)calloc(1, sizeof(*pVector)); 

    return pVector; 
} 

int pushBackArray(ptVector pVector, ptArray pArrayToAppend) 
{ 
    int res = 0; 

    if(pVector && pArrayToAppend) 
    { 
     pVector->pData = (ptArray*) realloc(pVector->pData 
              , sizeof(ptArray) * pVector->size + 1); 

     if(pVector->pData) 
     { 
      pVector->pData[pVector->size] = createArray(pArrayToAppend->size); 

      if(pVector->pData[pVector->size]) 
      { 
       memcpy(pVector->pData[pVector->size]->pData 
         , pArrayToAppend->pData 
         , pVector->pData[pVector->size]->size * sizeof(int)); 
       pVector->size++; 
      } 
      else 
      { 
       pVector->pData = (ptArray*) realloc(pVector->pData 
                , sizeof(ptArray) * pVector->size); 
       res = 3; 
      } 
     } 
     else 
      res = 2; 
    } 
    else 
     res = 1; 

    return res; 
} 

void destroyVector(ptVector *pVector) 
{ 
    if(pVector) 
    { 
     unsigned int i; 

     for(i = 0; i < (*pVector)->size; i++) 
      destroyArray(&((*pVector)->pData[i])); 

     free((*pVector)->pData); // Heap Corruption throw 
     free(*pVector); 
     (*pVector) = NULL; 
    } 
} 
+0

[不投的malloc'的返回值()'和朋友,在C](HTTP://計算器的.com /一個/28169分之605858)。此外,請重新閱讀'realloc()'的文檔。它可能會失敗,因此您需要先檢查是否會丟失舊的緩衝區。 – unwind 2013-05-08 12:29:44

+0

'char argc'?任何編譯器都能接受嗎? – suspectus 2013-05-08 12:31:41

+1

@suspectus是的,例如gcc接受。你需要'-pedantic-errors'或類似的東西來拒絕。 – 2013-05-08 12:50:58

回答

0

指定大小是不正確的功能pushBackArray

sizeof(ptArray) * pVector->size + 1 

sizeof(ptArray) * (pVector->size + 1) 
+0

謝謝BLUEPIXY!現在你說出來,很明顯,像往常一樣... – gfache 2013-05-10 08:54:41

+0

不客氣。 – BLUEPIXY 2013-05-10 08:57:54