下面的代码偶尔会在buffer = (char*) realloc(buffer, allocated * sizeof(char));
我用来为 a 动态分配空间的调用(在下面标记)中失败,方法char*
是最初分配 1 个字符,并且每次我已经拥有的内存不足以存储字符串时将分配的数量加倍。
我在项目的许多其他部分都有非常相似的代码,具有相同的内存分配策略和调用(仅更改void*
I 传递到的类型realloc
)。
我正在使用VS2010调试问题,当我在调试模式下启动程序时,该功能总是成功完成。
但是,当从命令行调用程序时,很有可能对 realloc 的调用之一会在一段时间后失败,并出现“访问冲突读取位置”错误 - 尽管它不会一直发生,而且只是在多次调用下面的函数之后发生,并且已经发生了许多重新分配。
更奇怪的是,我在 realloc 调用之前和之后放置了一些打印来断言指针位置是否已更改,并且当我这样做并运行程序时,对 realloc 的调用随机停止失败。
我究竟做错了什么?
TOKEN
next_token_file(FILE* file,
STATE_MACHINE* sm,
STATE_MACHINE* wsssm)
{
char* buffer = (char*) malloc(sizeof(char));
size_t allocated = 1;
size_t i = 0;
while(1)
{
/*
... code that increments i by one and messes with sm a bit. Does nothing to the buffer.
*/
// XXX: This fails when using realloc. Why?
if(i + 1 >= allocated)
{
allocated = allocated << 1;
buffer = (char*) realloc(buffer, allocated * sizeof(char));
}
buffer[i] = sm->current_state->state;
/*
... more code that doesn't concern the buffer
*/
}
// Null-terminate string.
buffer[++i] = 0;
TOKEN t = {ret, buffer};
return t;
}