1

こんにちは世界(こんにちは人々)、

まず、これが私の最初の投稿ですので、お手柔らかにお願いします。
タイトルが示すように、オブジェクトを解放したいときにヒープが破損しました。修正するのに数時間かかりましたが、明らかだと確信しているにもかかわらず、何が問題なのかわかりません!
だから私はあなたに来ます。

私の目標は、C で std::vector 関数を (不十分に) 模倣する関数を作成することです。すべてのオブジェクトは動的に作成されます。ポインターを大量に使用するため、実装が難しい場合があります。
ベクター オブジェクトを解放するとヒープが破損しましたが、pushBack によるものか、destroy 関数によるものかはわかりません。
詳細についてはお気軽にお問い合わせください。建設的なコメントは大歓迎です!

ここにいくつかのコードがあります:

ヘッダーの内容:

#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;
    }
}
4

1 に答える 1

0

関数 pushBackArray でのサイズの指定が正しくありません

sizeof(ptArray) * pVector->size + 1

sizeof(ptArray) * (pVector->size + 1)
于 2013-05-08T21:08:22.813 に答える