954,480 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Freeing memory causing Windows to trigger a breakpoint?

Hi all!

So our T.A. gave us a function to use in our programming assignment as follows:

struct node *delete_from_list(struct node *list, int examnum)
{
	struct node *cur, *prev;
	for (cur = list, prev = NULL; 
		 cur != NULL && cur->examNumber != examnum; 
		 prev = cur, cur =cur ->next)
		 ;
	if(cur == NULL)
	{
		
		return list;		//n was not found
	}
	if (prev == NULL) 
	
		list = list ->next;	
							//n was in the first node
	else 
		prev->next = cur->next;	//n was in another node
	free(cur);
	return list;
}


After about the third time this function is called, I get an error at the free(cur) second line from the bottom saying Windows has inserted a breakpoint possibly due to heap corruption and a few other technical sounding phrases, but I can't make anything out of it. Any idea what's wrong? Is this enough context?

spursfan2110
Newbie Poster
23 posts since Feb 2010
Reputation Points: 10
Solved Threads: 0
 

Actually, to be more specific, it appears to happen immediately before the free(cur) would be executed...which seems even odder to me.

spursfan2110
Newbie Poster
23 posts since Feb 2010
Reputation Points: 10
Solved Threads: 0
 
Actually, to be more specific, it appears to happen immediately before the free(cur) would be executed...which seems even odder to me.


Likely you arewriting to already freed memory, outside this delete_from_list() function. The debug memory management facilities kick in upon the attempt to free() , catching the aforementioned error (-> runtime error message).

A minimal example that you could try out to see how it happens, would be along the lines of..

int main()
{
  /*  Allocate a node and initialize its examNumber to 1 */
  struct node * p1 = alloc_node(1);

  /*  Allocate a node and initialize its examNumber to 2 */
  struct node * p2 = alloc_node(2);

  /*  Make a list .. */
  struct node * list = p1;
  p1->next = p2;
  p2->next = NULL;

  /*  free p1 .. */
  list = delete_from_list(list, 1);

  /*  p1 still is accessible here, pointing to the freed memory, 
   *  now write to that memory ..
   */
  p1->next = NULL;

  /*  Try to free p2 .. */
  list = delete_from_list(list, 2);

  return 0;
}


For little more information on how this error gets caught, you might read Magic debug values .

[EDIT]
Also check that you are not trying to free anything twice/nor writing out-of-bounds.

mitrmkar
Posting Virtuoso
1,809 posts since Nov 2007
Reputation Points: 1,105
Solved Threads: 395
 

Hi all!

So our T.A. gave us a function to use in our programming assignment as follows:

struct node *delete_from_list(struct node *list, int examnum)
{
	struct node *cur, *prev;
	for (cur = list, prev = NULL; 
		 cur != NULL && cur->examNumber != examnum; 
		 prev = cur, cur =cur ->next)
		 ;
	if(cur == NULL)
	{
		
		return list;		//n was not found
	}
	if (prev == NULL) 
	
		list = list ->next;	
							//n was in the first node
	else 
		prev->next = cur->next;	//n was in another node
	free(cur);
	return list;
}

After about the third time this function is called, I get an error at the free(cur) second line from the bottom saying Windows has inserted a breakpoint possibly due to heap corruption and a few other technical sounding phrases, but I can't make anything out of it. Any idea what's wrong? Is this enough context?

Aha! I figured it out. The problem was, I thought I was mallocing nodes within a loop, but it turns out I only malloced one node prior to the loop, and so I was trying to free nodes that hadn't been malloced. I am not quite sure why it worked for the first few times as opposed to just 1 iteration, but I guess that's one of life's mysteries.

spursfan2110
Newbie Poster
23 posts since Feb 2010
Reputation Points: 10
Solved Threads: 0
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: