1

私は C++ を学ぼうとしていますが、少し混乱しています。

私が学んでいるテキストは、タイプのノードを削除したい場合は、const T&最初にそのノードタイプの新しいポインターを作成し、次に組み込みの C++ を使用して削除する必要があることを教えてくれますdelete[]。しかし、削除対象ノードの前の要素から削除対象ノードの次の要素へのリンクを設定しただけではどうなるでしょうか。何かのようなもの:

*p = node.previous;
p-> next = node.next;

または、これによりメモリリークが発生しますか?

私はどこかでポインタを削除しないように読んだので混乱していますが、私が取り組んでいるサンプルコードには次のようなものがあります:

Node<T> *p = node-to-be-deleted;
delete p;

ノードを削除する最良の方法は何ですか?

4

4 に答える 4

2

ノードが次のようになっていると仮定します。

struct Node
{
    Node*  previous;
    Node*  next;

    SomeType data;
};

それで:

*p = node.previous;
p-> next = node.next;

次に、はい。これにより、メモリリークが発生します。
またp->next->prev、間違ったノードを指しているままになります。

私はどこか他の場所を読んで、ポインタを決して削除しないので混乱していますが、私が使用しているサンプルコードには、次のようなものがあります。

はい、最善の方法は「ポインタを削除しない」ことです。しかし、これはいくつかの状況に沿ったものでなければなりません。ポインタは寿命を制御するオブジェクトによって管理される必要があるため、ポインタを手動で削除しないでください。これらのオブジェクトの中で最も単純なものは、スマートポインターまたはコンテナーです。しかし、この状況では、(コンテナを作成しているので)やり過ぎになります。

コンテナー(リスト)を作成するときは、自分で管理を行う必要があります(C ++には、タイプtの値のリストの場合はstd :: listが、ポインターのリストの場合はboost::ptr_listがすでにいくつか失われていることに注意してください。 Tへ)。しかし、自分でやってみるのは良い練習です。

リストを作成する初心者のコードレビューとそれが生成したコメントの例を次に示します。

http://codereview.stackexchange.com:C++リンクリスト

これが、オブジェクトの作成方法と削除方法の説明に役立つことを願っています。

于 2013-01-08T00:34:33.660 に答える
1
Node* p = new Node; // This is how you allocate a node
delete p; // This is how you delete it

動的に割り当てられた配列では、delete[] 演算子を使用する必要があります。

Node* nodelist = new Node[ 4 ]; // nodelist is now a (dynamically allocated) array with 4 items.
delete[] nodelist; // Will delete all 4 elements (which is actually just one chunk of memory)
于 2013-01-07T21:40:18.367 に答える
0
void deleteNode( Node * p )
{
    Node * temp = p->next;
    p->data = p->next->data;
    p->next = temp->next;
    free(temp);
}

これは私が数ヶ月前にしたことです。

template <class T>
T LinkedList<T>::remove(int pos)
{
    if (pos < 1 || pos > size)
    {
        throw pos;
    }
    ListNode * temp;
    if (pos == 1)
    {
        temp=head;
        head = head->next;
    }
    else
    {
        int i=1;
        ListNode * prev = head;

        while(i<pos-1)
        {
            i++;
            prev=prev->next;
        }
        temp = prev->next;

        prev->next = (prev->next)->next;

    }
    --size;
    return temp->item;
}
于 2013-01-07T21:40:24.303 に答える
0

Nodeaを直接削除することは、デストラクタを実装して周囲のインスタンスのおよびポインタNodeを更新する場合にのみ意味があります。次に例を示します。previousnextNode

Node::~Node()
{
    if (previous) previous->next = next;
    if (next) next->previous = previous;
}

Node *p = node-to-be-deleted;
delete p;

Nodeそれ以外の場合は、問題のオブジェクトを削除する前にポインターを更新する必要があります。次にNode例を示します。

Node *p = node-to-be-deleted;
if (p->previous) p->previous->next = p->next;
if (p->next) p->next->previous = p->previous;
delete p;

そうは言っても、最初から手動でリンク リストを実装しないことが最善の方法です。C++ では、std::list代わりにコンテナーを使用して、これらの詳細を処理させます。

于 2013-01-07T21:47:51.577 に答える