akohan
asked on
why memory is not freed?
Hello group,
I was reading a book which has a nice example to start with link lists (in snippet) but I'm wondering why allocated memory is not given back to system?!
Is this an exception or is missed?
since I'm still learning I need to make sure things I'm learning here are right.
Regards,
ak
I was reading a book which has a nice example to start with link lists (in snippet) but I'm wondering why allocated memory is not given back to system?!
Is this an exception or is missed?
since I'm still learning I need to make sure things I'm learning here are right.
Regards,
ak
#define RECORDS 6
int main()
{
struct jb {
char actor[25];
struct jb *next;
};
char *bonds[RECORDS] = {
"Sean Connery",
"David Niven",
"George Lazenby",
"Roger Moore",
"Timoth Dalton",
"Pierce Brosnan"
};
struct jb *first_item;
struct jb *current_item;
struct jb *new_item;
int index = 0;
first_item = (struct jb *)malloc(sizeof(struct jb));
current_item = first_item;
//this loop is only for feeding the structure
while(1)
{
strcpy(current_item->actor, bonds[index]);
index++;
if (index< RECORDS)
{
new_item=(struct jb *)malloc(sizeof(struct jb));
current_item->next = new_item;
current_item = new_item;
}
else {
current_item->next = NULL;
break;
}
}
current_item = first_item; /*start over*/
index = 1;
while(current_item)
{
printf("Structure %d: ", index++);
printf("%s\n", current_item->actor);
current_item = current_item->next;
}
return 0;
}
ASKER
So, using fee() function only is enough?
e.g.
free(first_item);
first_item=NULL:
and etc...
>> (SORRY CAPS ON)
lol. You know you can turn it off, don't you ? ;)
akohan, dynamically allocated memory has to be explicitly free'd using free :
http://www.cplusplus.com/reference/clibrary/cstdlib/free.html
lol. You know you can turn it off, don't you ? ;)
akohan, dynamically allocated memory has to be explicitly free'd using free :
http://www.cplusplus.com/reference/clibrary/cstdlib/free.html
if not explicitly freed, the allocated memory is given back to system when the program exits
>> So, using fee() function only is enough?
For every malloc, you need to have a corresponding free. So, in your case, every node in the linked list needs to be free'd.
For every malloc, you need to have a corresponding free. So, in your case, every node in the linked list needs to be free'd.
p.s. only free the memory once you have finished using it. :-)
if you write to the memory after you have sent it back the program will throw exeption
cool, I like this CAPs ON CAPS off toggle Key , although my keyboard has
stupidly marked as 'caps lock' :-))
if you write to the memory after you have sent it back the program will throw exeption
cool, I like this CAPs ON CAPS off toggle Key , although my keyboard has
stupidly marked as 'caps lock' :-))
Actually, no.
Usually no exception will be thrown if you attempt to write to free()'d memory.
What happens in practice is far more insidious.
Writing to free()'d memory will very likely corrupt the heap, and (if you're lucky) cause your program to crash the next time you attempt to allocate or free memory.
If you are unlucky, another malloc()' call will have assigned that memory, and you will be silently corrupting data elsewhere in your program.
If you want to release the memory, you should free it after you take it out of your list, and perform no further operations on removed nodes, once they are freed.
Usually no exception will be thrown if you attempt to write to free()'d memory.
What happens in practice is far more insidious.
Writing to free()'d memory will very likely corrupt the heap, and (if you're lucky) cause your program to crash the next time you attempt to allocate or free memory.
If you are unlucky, another malloc()' call will have assigned that memory, and you will be silently corrupting data elsewhere in your program.
If you want to release the memory, you should free it after you take it out of your list, and perform no further operations on removed nodes, once they are freed.
struct jb* temp;
while(current_item)
{
printf("Structure %d: ", index++);
printf("%s\n", current_item->actor);
temp = current_item;
current_item = current_item->next;
free(temp); /* temp is no longer in the list, now free it... */
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
OTHERWISE IT WILL BE RELEASED WHEN THE PROGRAM ENDS
(SORRY CAPS ON)