在释放内存时触发断点

时间:2016-04-05 12:21:58

标签: c breakpoints free

我试图释放这段代码所使用的内存,但它触发了一个没有提示原因的断点,有人可以解释原因吗

有问题的代码

store(testPool, poolSize - 1, sizeof(str), str);
printf("Test 6: Store / Retrieve past the end of memory\n");
printf("\tStored: %s\n", str);
void* temp = retrieve(testPool, poolSize - 1, sizeof(str) - 1);
if (temp != NULL)
{
    printf("\tRetrieved value\n");
}
else
{
    printf("\tRetrieved NULL\n");
}
freePool(testPool);

当我试图释放池中的内存时,会弹出错误,而且我不知所措

void freePool(Pool* pool)
{
    if (pool != NULL)
        if (pool->memory != NULL)
        {
            free(pool->memory); //here
            free(pool);
        }

}

这里是我用固定大小

来分配池的地方
const int poolSize = 560;
testPool = allocatePool(poolSize);

这是代码的其余部分,如果它有帮助的话

typedef struct _POOL
{
    int size;
    void* memory;

} Pool;

Pool * allocatePool(int n)
{
    Pool *pool =(Pool*) malloc(sizeof(Pool));
    if(pool != NULL)
        pool->memory = malloc(sizeof(char) * n);
        if (pool->memory != NULL)
            if(n > 0)
                pool->size = n;
        else
            free(pool);

    return pool;
}




void store(Pool* pool, int offset, int size, void *object)
{
    if (pool != NULL)
        if (size < pool->size)
            memcpy((char*)pool->memory + offset, object, size);
}

void *retrieve(Pool* pool, int offset, int size)
{
    return (char*)pool->memory + offset;

}

1 个答案:

答案 0 :(得分:0)

你在store中捣毁记忆。

您为池分配560个字节。

然后你拨打store(testPool, poolsize-1, sizeof(str), str)

我们假设sizeof(str)为30

store你基本上这样做:

memcpy((char*)pool->memory + 559, object, 30);

因此将29个字节写入已分配的内存,请记住pool->memory指向一个只有560个字节长的内存片。

这会导致未定义的行为,导致大部分时间处于崩溃状态,无论是在程序中还是在程序中稍后或其他奇怪行为。

整个节目很可疑。