当我释放一个void指针时,我得到了一个segfault。。。
我正在尝试制作一个动态的通用数组,在我的游戏中存储敌人:
typedef struct EnemyPool {
void** elements;
unsigned int element_count;
unsigned int element_capacity;
unsigned int element_size;
} EnemyPool;
这是一个空指针数组。
我创建这样的数组:
pool->elements = malloc(pool->element_capacity * sizeof(void*));
更新如下:
pool->element_capacity *= 2;
pool->elements = realloc(pool->elements, pool->element_capacity * sizeof(void*));
我创建了这样的新元素:
pool->elements[new_idx] = malloc(pool->element_size);
pool->element_size
是正确的,它只是这个数组存储的元素类型的sizeof
。。。
为什么,当我这样做的时候:
free(pool->elements[0]);
我得了一个segfault。。。
我认为它释放了太多内存,因为segfault不是来自free
函数,而是来自glfwSwapBuffers
,但只是在调用了这个特定的free
之后——之前我溢出缓冲区时也发生了类似的事情,这就是为什么我认为它会释放太多内存。问题是为什么?
segfault与free
或损坏的内存完全无关:我在调用了指针上的free
之后就试图访问它……正如一位评论者所建议的,我使用Valgrind解决了这个问题。直到今天,我才真正知道Valgrind的存在,这真的很有帮助。