2016-07-30 94 views
1

我有一个C++背景,并且是C中的一个新手。我想用C写一个通用向量。直到我决定添加一个自由函数来删除每个元素时,事情都很好。但是现在该程序会在运行free()函数时崩溃,该函数在vectorFree()中。这段代码为什么会导致无效指针?

我还没有测试免费函数,我只是通过NULL和矢量已经不能工作。在添加免费功能之前,矢量运行良好。

这里是我的代码,我省略了所有的意见和不相关的代码:

vector.h

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.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

在后一种情况下,您不需要parens:'sizeof * vector'。 – melpomene

+3

@melpomene的确如此。然而,即使不需要时,我总是使用带括号的'sizeof' - 主要是为了视觉上的一致性。 – dasblinkenlight

相关问题