2

イテレータを初期化するのを忘れてから、イテレータが指しているはずのデータにアクセスしようとするため、膨大な時間を無駄にしています。この種のエラーを発生させる唯一のマーカーは、実行時のセグメンテーション違反です。次に例を示します。

vector<Foo> V;
//Uninitialized pointer:
vector<Foo>::iterator it;
//....loads of code later, attempt to access pointer that points to nothing
(*it);
//Segmentation fault!

この種のチェックをコンパイル時に自動的に行う標準的な手法はありますか?

4

3 に答える 3

2

コンパイル時?いいえ。

いくつかの実行時ヘルパーが思い浮かびます。まず使用することboost::optionalです。2 つ目は、反復子の初期化に使用できるセンチネル ベクトルを設定することです。

static vector<Foo> null_vector;
vector<Foo>::iterator it = null_vector.begin();
...
if (it == null_vector.begin())
于 2013-10-31T14:38:08.493 に答える
2

C++14 では、値が初期化された iterators を比較することは許容されます。(2013 年 4 月採択)

したがって、これは真実です:

vector<int>::iterator i1{};
vector<int>::iterator i2{};
assert(i1 == i2);

しかし、これはまだ無効です:

vector<int>::iterator i1;
vector<int>::iterator i2;
assert(i1 == i2);

ただし、どのコンパイラがこれをサポートしているかはまだわかりません。

于 2014-05-05T06:15:43.247 に答える
1

実際のコードで使用するテクニックがいくつかあります。まさにあなたが探しているものはありません。

まず、プログラミングの実践として、私は通常、変数が必要な場所の近くで、変数を初期化できる時点でインスタンス化します。初期化されていない変数をインスタンス化することはありません。

インスタンス化と初期化を 1 か所で行うことができない場合があります。このような場合、Boost のoptionalなどを使用し、それを使用する必要がある時点で が設定されているかどうかを確認しますoptional

インスタンス化と初期化を 1 か所で行うことが不可能な場合、それは関数の設計が不器用で扱いにくいか、やりすぎていることが原因であることがよくあります。これらの責任を複数の関数に分割してみると、最初の問題 (1 つの場所で初期化とインスタンス化ができない) が解消され、よりクリーンなコードが得られることに気付くかもしれません。

于 2013-10-31T14:41:27.820 に答える