2013-05-08 67 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