2016-12-22 11 views
1

私はこのプログラムを実行しようとすると、このセクションで発生しsegementation障害があります:Segementation max_elementを使用して、障害()とmin_element()

 std::vector<double> dist1(dist); 

     dist1.erase(std::remove(dist1.begin(), dist1.end(), 0), dist1.end()); 

     max = *std::max_element(dist1.begin(),dist1.end()); 

     min = *std::min_element(dist1.begin(),dist1.end()); 

それは(max_elementの使用です) min_element()はセグメンテーション・フォルトを引き起こしますが、なぜそれは表示されません。ここで私がやっていることは、ベクトルdistをdist1にコピーし、新しいベクトルのすべての発生を取り除き、distの残りの項目の最小値と最大値を検索します。 "max"と "min "は以前に宣言されたdouble型の変数です。 "dist"は、先に

として宣言されています。
std::vector<double> dist; //vector used to hold the distances between adjacent vertices 

dist.resize(size); 

コードはLinuxサーバでg ++でコンパイルされています。ご意見をお聞かせください。

+3

正常にコンパイルされたすべてのコードにバグが自動的に発生した場合、私は仕事を失います。 –

答えて

1

おそらくdist1は、適用後に空です削除/削除操作。

入力間隔が空の場合std::min_elementstd::max_elementは入力範囲の最後を返します。結果として、dist1.end()を逆参照しようとしたときにクラッシュします。

0

セグメンテーションフォールトを引き起こすのは、max_element()およびmin_element()ですが、その理由はわかりません。

いいえ、それは、セグメンテーションフォールトが発生し、結果の間接参照です。

が空のの範囲でこれらの関数を使用すると、終了イテレータが返されます。そのイテレータを参照解除しようとすると、未定義の動作になります。セグメンテーションフォールトは一般的ではありますが、未定義の動作の結果ではありません。

ベクトルが空でないように(理想的にはアサーションを追加しないように)、空のベクトルをサポートするようにプログラムロジックを変更する必要があります。

オプション1:

// code that prevents dist1 from being empty goes here 
// ... 
auto const max_iter = std::max_element(dist1.begin(), dist1.end()); 
assert(max_iter != dist1.end()); 
auto const max = *max_iter; 

オプション2:

auto const max_iter = std::max_element(dist1.begin(), dist1.end()); 
if (max_iter == dist1.end()) 
{ 
    // do something to handle the special situation 
} 
else 
{ 
    auto const max = *max_iter; 
    // normal program flow 
} 
0

が、私はそれが動作するように取得する方法を発見しました。代わりにちょうど

std::vector<double> dist1(dist) 

コピーコンストラクタを使用して、私はまた、宣言し、次のように私の新しいベクトルをリサイズ:まだ私を悩ます

std::vector<double> dist1(size); 
dist1=dist; 

ことの一つは:コピーコンストラクタは、このすべてを行っていないでしょうか?