8

タイプのポインターがありT (T*)、それらの配列があるT* array[N]場合、これら 2 つのメソッドを使用すると、後でどのエントリが null ポインターであるかを確認して、各バケット内のものを遅延初期化できますか?

memset(array, 0, sizeof(T*)*N);

また

for (int i = 0; i < N; ++i)
    array[i] = NULL;

つまり、memset呼び出しも後で行うことができif (array[i] == NULL) ...ますか?

そうでない場合は、未定義の動作を導入したくありません..

4

2 に答える 2

11

null ポインター値は技術的にはすべてゼロ ビットである必要はありませんが、すべてゼロ ビットではないシステムについては知りません。したがって、どちらの方法でも機能するはずです。

ただし、配列を初期化するより簡単な方法があります。これにより、悪意のある実装でも正しい null ポインター値が設定されます。

T *array[N] = {};

または、動的に割り当てる場合:

T **array = new T*[N]();
于 2012-10-04T21:14:05.560 に答える
2

ヌル ポインターがメモリ内memsetの値によって表されるという要件がないため、正式には、このアプローチは機能しません。0実際には問題なく動作します。

両方より良い: std::uninitialized_fill; 標準ライブラリの実装者は、パフォーマンスを最適化するためにできないことを行うことができます。

于 2012-10-04T21:13:18.997 に答える