2016-07-30 5 views
1

私はC++のバックグラウンドを持ち、Cで初心者です.Cでジェネリックベクターを作成したいと思いました。各要素を削除するフリー関数を追加するまでは問題ありませんでした。しかし今度はfree()関数をvectorFree()で実行している間、プログラムはクラッシュします。このコードが無効なポインタを引き起こすのはなぜですか?

私はまだフリー関数をテストしていませんが、私はNULLを渡してしまい、ベクトルはすでに動作しません。フリー機能を追加する前に、ベクターはうまくいきました。ここで

は、私はすべてのコメントと無関係なコードを省略し、私のコードです:

typedef void (*FreeFunction)(void *element); 

typedef struct Vector { 
    void *elements; 
    ... 
    FreeFunction freeFunc; 
} Vector; 

Vector* vectorAlloc(size_t elemSize, VectorFreeFunction freeFunc); 
void vectorFree(Vector *vector); 

... 
vector.h

vector.c

Vector* vectorAlloc(size_t elemSize, VectorFreeFunction freeFunc) 
{ 
    Vector* vector = malloc(sizeof(vector)); 
    ... 

    vector->elements = malloc(elemSize * vector->capacity); 
    ... 

    vector->freeFunc = freeFunc; 
    return vector; 
} 

void vectorFree(Vector *vector) 
{ 
    if (vector->freeFunc != NULL) { 
     for (int i = 0; i < vector->size; i++) { 
      vector->freeFunc(vectorAt(vector, i)); 
     } 
    } 

    free(vector->elements); 
    free(vector); 
} 

... 

vectorTest.cpp

void test() 
{ 
    Vector* num = vectorAlloc(sizeof(int), NULL); 
    vectorFree(num); 
} 
+2

これがCならば、あなたのファイルはなぜ 'vectorTest.cpp'と呼ばれていますか? – melpomene

答えて

3

この行は問題、それは十分なメモリを割り当てませんので:

Vector* vector = malloc(sizeof(vector)); 

それは

Vector* vector = malloc(sizeof(Vector)); 

(資本V付き)または

Vector* vector = malloc(sizeof(*vector)); 

(アスタリスク*付き)のいずれかでなければなりません。

+1

後者の場合、括弧は必要ありません: 'sizeof * vector'。 – melpomene

+3

@melpomeneそれは本当です。しかし、括弧付きの 'sizeof'は、必要でないときでさえ、常に他のものよりも視覚的な一貫性のために使用されます。 – dasblinkenlight

関連する問題