2017-02-22 3 views
0

私はシーケンシャルリストを使用してキューを実装しようとしています。ただし、文字列要素を含むキューでは、プログラムがクラッシュします。クラス実装の文字列のデフォルトのデストラクタをオーバーライド

{ 
    string *ptr = new string[num]; 
} 

しばらく見た後、私は問題がデストラクタである疑いがある:

は、以下キューコンストラクタの関連部分です。デストラクタを呼び出すことで、私は順次リストの配列ポインタを削除していますし、NULLに設定する:文字列ライブラリは、文字列を削除し、デフォルトのデストラクタを、提供するので、

{ 
    delete ptr; 
    ptr = NULL; 
} 

しかし、私はその後、削除しようとしています存在しないポインタ。私はこれがアクセス不能なメモリにアクセスしていると思います。これはセグメンテーションフォルトを引き起こします。キューインプリメンテーションはint型とdouble型の両方でうまく機能します。

私は、int型、double型、string型のテンプレートにテンプレートを使用しています。デストラクタが空の場合、int要素とdouble要素Queueのメモリを動的に解放しません。

空のクラスデストラクタを持ち、デフォルトの文字列デストラクタを使用する以外に簡単な方法はありますか?

+0

なぜ 'std :: string'を使用していませんか?デストラクタをオーバーライドする必要はありません。あなたのテンプレートが 'int'、' double'で動作するなら '' std :: string'と一緒に動作し、何も削除する必要は特にありません。 – PaulMcKenzie

+5

コードをコピーして貼り付けてコンパイルするだけで、読者が試してみることができる最小限の完全な例を投稿してください。 –

+0

Alf - この質問はクラス割り当てのボーナスに関連しているので、私はより一般的なものにしようとしています。しかし、アドバイスをいただきありがとうございます。 –

答えて

0

deleteは、単純でないタイプの最初のインスタンスだけを削除します。 delete []はすべてのインスタンスのdtorsを呼び出します

ここでは完全なスコープはわかりませんが、注記のためだけにnullptrを削除することはよく定義されており、何もしません。

関連する問題