Is there a memory leak in the following code example as I have allocated memory on the heap for name which hasn't been freed? If I add free(person->name); before the free(person); line then I get a runtime error in VS "CRT detected that the application wrote to memory after end of heap buffer".
header.h:
#ifndef HEADER
#define HEADER
typedef struct person {
char *name;
} Person;
#endif
source.c:
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
#define BUFFERSIZE 500
int main (int argc, char* argv[]){
Person *person = NULL;
char buffer[BUFFERSIZE];
printf("Enter name\n");
fgets(buffer, BUFFERSIZE, stdin);
{
char *name;
person = malloc(sizeof(Person));
name = malloc(strlen(buffer));
strcpy (name,buffer);
person->name = name;
}
free(person);
return 0;
}
Thanks, Rob
strlen doesn't account for the null-terminator that strcpy adds, you'll need to "malloc(strlen(buffer)+1)"
Yes, the code has a memory leak.
The culprit is:
name = malloc(strlen(buffer));
which should bename = malloc(strlen(buffer)+1);
to account for \0
.
You should now be able to free person->name
.
Yes. There is a memory leak.
You allocate a name buffer:
name = malloc(strlen(buffer));
and never deallocate it. Then when you deallocate the Person
,
free(person);
you lose your last pointer to that buffer, so you can never deallocate it.
The error message you are getting is a separate issue related to the length of the name buffer that you allocate being insufficient to include the null termination of the string you try to copy into it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With