世界,你好(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;
}
}
[不投的malloc'的返回值()'和朋友,在C](HTTP://計算器的.com /一個/28169分之605858)。此外,請重新閱讀'realloc()'的文檔。它可能會失敗,因此您需要先檢查是否會丟失舊的緩衝區。 – unwind 2013-05-08 12:29:44
'char argc'?任何編譯器都能接受嗎? – suspectus 2013-05-08 12:31:41
@suspectus是的,例如gcc接受。你需要'-pedantic-errors'或類似的東西來拒絕。 – 2013-05-08 12:50:58