i came into Assertion failure during running this program, and i really don't know why, hope you guys can help, thanks a lot ^^

The program is to copy a linked list from another, the Copy function may look complicated because i'm not experienced enough to simplify it.. Without the destructor, the program runs fine..

#include <iostream.h>

struct node
{
	int data ;
	node * next ;
};

class list
{
private:
	node *head ;
public:
	list() ;
	[B]//~list() ;[/B]
	node* Add(node *h , int d) ;
	node* Copy(node *& res , node * copy) ;
	void Input() ;
	void Display() ;
	node* GetHead() ;
	void AssignHead(node *h) ;
};

list::list()
{
	head = NULL ;
}

[B]/*list::~list()
{
	while(head)
	{
		node *current = head->next ;
		delete head ;
		head = current ; 
	}
}*/[/B]

node * list::GetHead()
{
	return head ;
}

void list::AssignHead(node *h)
{
	head = h ;
}

node * list::Add(node *h , int d)
{
	if ( !h )
	{
		h = new node ;
		h->data = d ;
		h->next = NULL ;
	}
	else
		h->next = Add(h->next , d) ;
	return h ;
}

void list::Input()
{
	int n ;
	int d ;
	cout << "How many intergers to input: " ;
	cin >> n ;

	for ( int i = 0 ; i < n ; ++i )
	{
		cout << "Interger #" << i+1 << ", please enter: " ;
		cin >> d ;
		head = Add(head,d) ;
	}
}

void list::Display()
{
	node * current = head ;
	while (current != NULL)
	{
		cout << current->data << " " ;
		current = current->next ;
	}

}

node * list::Copy(node *& res , node * copy)
{

	if (copy)
	{
		res = copy ;
		Copy(res->next,copy->next) ;
	}

	return res ;
}



int main()
{
	list integer , a ;

	integer.Input() ;

	integer.Display() ;
	cout << endl ;

	//a.Input() ;

	//a.Display() ;

	node *res = NULL ;
	a.AssignHead(a.Copy(res , integer.GetHead())) ;

	a.Display() ;

	return 0 ;
}

while(head) - why???
you need only:

list::~list() {
	node* current = head->next;
	delete head;
	head = current;
}

The problem, while exhibiting itself when the destructor is called, is not actually in the destructor. Your Copy function makes a shallow copy - in your code object "a" points to the same memory as object "integer". When the first of those gets destroyed at program exit, the pointed to memory of head gets deleted. When the second one is passed to the destructor, it head still has that memory address, but there is no "next" member. So an invalid address is assigned to current, and then to head, and that fails when you try to access the next member of that nonexistent object.

oh i under stood, thanks a lot, i made 2 pointers pointing to the same object at the same time, so redeleting is for sure, thanks a lot again.. Need to fix the Copy function :)

@ ivailosp: oh i want the destructor to delete every element inside the linked list, if i take ur code, it may delete only the beginning :-?

This article has been dead for over six months. Start a new discussion instead.