0

私はデータ構造の基本を実験しているだけで、何かに興味がありました。私のコードでわかるように、pポインターをいじった後、それを削除することにしました。pポインターを削除しましたが、これも削除されると思いましたdelete p->proximo(「proximo」はポルトガル語で「next」です)が、明らかにそうではありませんでした。Acesso 3(ポルトガル語でAccess 3)の結果は022でした。

では、まず、ポインターを削除した場合でも、なぜポインターに接続できるのp->proximoでしょうか。わかりましたが、そうではなかったので、それは良いことです。つまり、今は削除できるということです。そこで、22の値を最初のNodに移動することにしました。だから私はリストに壊れたノードを持っていなかっただろう。p = p->proximo28行目でわかるように使ってみましたが、うまくいきませんでした。もちろんそうではありませんでした。ポインタを削除しました。リストを修正できるように最初のポインターを再作成して、最初のノードの値を22にする方法はありますか?で試してみました

p = new IntNode();
p = p->proximo;

しかし、それも失敗しました。おそらく、既存の次のノードが原因でしょうか?

皆様のご協力に心より感謝申し上げます。

コード:

#include <iostream>
using namespace std;

class IntNode{
public:
  IntNode(){
    proximo = 0;
  }
  IntNode(int file, IntNode *next = 0)
  {
    number = file;
    proximo = next;
  }
  int number;
  IntNode *proximo;
};

int main()
{
  IntNode *p = new IntNode(15);
  cout << "Acesso 1:  " << p->number;
  p->proximo = new IntNode(22);
  cout << endl << "Acesso 2:  " << p->number << "    " << p->proximo->number;
  delete p;
  cout << endl << "Acesso 3:  " << p->number << "     " << p->proximo->number << endl;
  p = new IntNode(5);
  cout << endl << "Acesso 4:  " << p->number << "     " << p->proximo->number << endl;
  p = p->proximo;
  cout << endl << "Acesso 5:  " << p->number << "     " << p->proximo->number << endl;
  delete p->proximo;
  cout << endl << "Acesso 6:  " << p->number << "     " << p->proximo->number << endl;
  return 0;
}
4

2 に答える 2

4

なぜまだp->プロキシモポインタに接続できるのですか?

それは未定義の振る舞いです。( @BoPerssonのコメントからのホテルの部屋のアナロジーを参照してください)p後も、指し示していたものがまだそこにあることが起こります。しかし、あなたはそれに頼ることはできません。ランタイムエラーが発生する可能性を高めたい場合、またはの有効性を確認できるようにする場合は、または(C ++ 11の場合)に設定します。deletepNULLnullptr

delete p;
p = nullptr;

次に、これを行うとき:

p = new IntNode(5);

p->proximonullに設定されます。これはあなたが自分でコーディングしたものなので、驚くべきではありません。

IntNode(int file, IntNode *next = 0)
{
  number = file;
  proximo = next;
}

最後に、タイトルの質問に答えるために、

C ++では、クラスへのポインターが破棄された後、新しい関数を使用してポインターを再利用できますか?

はい、できます。

delete p;
p = someOtherPointerToIntNode;
于 2013-02-27T09:19:58.973 に答える
1

削除すると、メモリの割り当てが解除されます。このメモリ位置にジャンプしても、データは上書きされない限り、そこに残ります。削除後に使用すると、バグを見つけるのが困難になる可能性が高くなるため、悪い習慣と見なされます。

于 2013-02-27T09:20:14.973 に答える