0
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;
        }
    }
}
4

1 に答える 1

1

誰かが連結から返されたオブジェクトを削除するのを忘れると、メモリ リークの問題が発生します。リストへの参照をパラメーターとして取得すると、リストを割り当てさせることができ、コード内で適切にスコープを離れます。

基本的に、関数にメモリを割り当てないでください。関数に渡す必要があります。

List<NODETYPE>& List<NODETYPE>::concatenate(const List<NODETYPE> &right, List &newList) const

関数を連鎖できるように、最後に newList への参照を返すことができます。

于 2013-04-17T03:32:07.003 に答える