template<typename NODETYPE>
const List<NODETYPE> &List<NODETYPE>::operator =(const List<NODETYPE> &right)
{
if(&right !=this)
//ListNode is another class I friended with my list class
{
ListNode<NODETYPE> *tempPtr = firstPtr;
ListNode<NODETYPE> *rightPtr = right.firstPtr;
if(firstPtr==lastPtr)
{
firstPtr = lastPtr = 0;
delete tempPtr;
while(rightPtr!=NULL)
{
insertAtBack(rightPtr->data);
rightPtr=rightPtr->nextPtr;
}
}
else
{
while(tempPtr!=NULL)
{
firstPtr = firstPtr->nextPtr;
delete tempPtr;
tempPtr = firstPtr;
}
while(rightPtr!=NULL)
{
insertAtBack(rightPtr->data);
rightPtr=rightPtr->nextPtr;
}
}
}
return *this;
}
template<typename NODETYPE>
List<NODETYPE>& List<NODETYPE>::concatenate(const List<NODETYPE>&right)const
{
ListNode<NODETYPE>*tempPtr = firstPtr;
ここで new 演算子を使用したので、オブジェクトを返したときにオブジェクトのデストラクタが呼び出されません。両方のリストで構成されるまったく新しい List オブジェクトを作成し、メモリ リークを回避しながらメイン関数に返したいと考えています。
List<NODETYPE>*newList = new List;
while(tempPtr != NULL)
{
newList->insertAtBack(tempPtr->data);
tempPtr = tempPtr->nextPtr;
}
tempPtr = right.firstPtr;
while(tempPtr != NULL)
{
newList->insertAtBack(tempPtr->data);
tempPtr = tempPtr->nextPtr;
}
return *newList;
}
メモリ リークを発生させずに newlist オブジェクトを返すにはどうすればよいですか?
template< typename NODETYPE >
void List< NODETYPE >::insertAtBack( const NODETYPE &value )
{
ListNode< NODETYPE > *newPtr = getNewNode( value ); // new node
if ( isEmpty() ) // List is empty
firstPtr = lastPtr = newPtr; // new list has only one node
else // List is not empty
{
lastPtr->nextPtr = newPtr; // update previous last node
lastPtr = newPtr; // new last node
} // end else
} // end function insertAtBack
template< typename NODETYPE >
void List< NODETYPE >::insertAtPos( const NODETYPE & value, int pos)
{
if (pos == 0)
insertAtFront(value);
else if (pos < 0)
cerr << "Trying to insert at invalid list position: " << pos << endl;
else {
ListNode< NODETYPE > * ptr = firstPtr;
for (int i=0; i<pos-1 && ptr != NULL; i++)
ptr = ptr->nextPtr;
if (ptr != NULL) {
ListNode< NODETYPE > *newPtr = getNewNode( value ); // new node
newPtr->nextPtr = ptr->nextPtr;
ptr->nextPtr = newPtr;
}
else {
cerr << "Trying to insert at invalid list position." << endl;
}
}
}