我试图释放这段代码所使用的内存,但它触发了一个没有提示原因的断点,有人可以解释原因吗
有问题的代码
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;
}
答案 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个字节长的内存片。
这会导致未定义的行为,导致大部分时间处于崩溃状态,无论是在程序中还是在程序中稍后或其他奇怪行为。
整个节目很可疑。