realloc fails after multiple calls only when not debugging
The below code occasionally fails on the buffer = (char*) realloc(buffer,
allocated * sizeof(char)); call (marked down below) that I use to
dynamically allocate space for a char*,by allocating 1 char initially, and
doubling the allocated amount every time the memory I already have is
insufficient to store the string.
I have very similar code in many other parts of my project, with the same
memory allocation policy and calls (changing only the type of the void* I
pass to realloc).
I am using VS2010 to debug the problem, and when I start the program on
debug mode, the function always completes successfully.
However, when calling the program from the command line, there is a good
chance that one of the calls to realloc will fail after some time with an
"Access violation reading location" error - though it doesn't happen all
the time, and only happens after the function below has been called
multiple times, with many reallocations having already taken place.
What's weirder, I put some prints before and after the realloc call to
assert if the pointer location was changed, and, when I did so and ran the
program, the calls to realloc stopped failing randomly.
What am I doing wrong?
TOKEN
next_token_file(FILE* file,
STATE_MACHINE* sm,
STATE_MACHINE* wsssm)
{
char* buffer = (char*) malloc(16 * 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;
}
No comments:
Post a Comment