2

似たような質問がたくさんあることは知っていますが、まだ役立つものは見つかりませんでした。私はこれで数時間過ごしましたが、それは私を夢中にさせています. コピー コンストラクターによって作成された変数に対してデストラクタが呼び出されると、セグメンテーション エラーが発生します。

//Copy Constructor
Stack::Stack(const Stack &aStack)
{
   size = 0; //this is incremented as new items are pushed onto the stack.
   cap= aStack.cap;
   items = new int[aStack.cap]();
   for (int i = 0; i < aStack.size; i++)
      this->push(aStack.items[i]);  //Adds an item if not full and increments size
      // I have also tried: items[i] = aStack.items[i]
}

//Destructor
Stack::~Stack()
{
   cap= 0;
   size= 0;
   delete [] items;
   items = NULL;
}

コピー コンストラクターが間違っているような気がしますが、それが何であるかわかりません。

4

2 に答える 2

1

この線:

for (int i = 0; i < aStack.top; i++)

次のようにする必要があります。

for (int i = 0; i < aStack.size; i++)

範囲外のインデックスまたは類似のもの (未定義の動作領域) にアクセスしようとしている可能性が高いため、セグ フォールトです。

于 2013-05-07T02:44:21.607 に答える
1

さて、私はそれを見つけました。私と同じくらい愚かな人 (基本的な C++ の知識がない) のためにここに置いて、彼らが私と同じものを探すのに何時間も費やさないようにします。

私の問題は、デストラクタが「選択的に」機能しているように見えることでした。一部のテストでは機能しましたが、他のテストでは失敗しました。テストを何時間も比較した後、ようやく見つけました。

失敗していたテストは pop 関数をテストすることで終了し、スタックが空になるまで続けました。私のデストラクタには delete [] items; 、ポップ関数に次の行があったことを除いて、これは問題ないという行がありますitems[size-1] = NULL; 。私は C++ に関する非常に基本的な知識があったため、delete コマンドが空の配列を処理できないことを知りませんでした。そのため、アイテムを事前に削除した行を単純に削除しました (基本的に、エンド ユーザーにとっては、カプセル化のためにアイテムは存在しなくなります。トップ インデックスは変更されるため、アクセスできなくなります)。

とにかく、最後のレッスン: delete [] items; 空の配列を処理しません (これは理にかなっていると思います。delete コマンドは、最終的な配列よりもはるかに長い配列を想定しています)。

于 2013-05-07T05:09:44.507 に答える