-2

ヒープ領域に割り当てられた新しい領域ごとに、最近作成されたポインタのベクトルの要素が NULL を指していることを確認するにはどうすればよいですか?

 Ex:
   vector < Sometype* >

   vector ----------------------
          |  |  |  | ...       |
          ----------------------

   new element is pushed back but no available area so double space

   index                         x  x+1            y
   vector -------------------------------------------
          |  |  |  | ...       |   |   | ...        |
          -------------------------------------------

                               ^^^^^^^^^^^^^^^^^^^^^
                                 recently created

         x, x+1, ... y all points to the NULL 

最近作成したパーツの各スペースを NULL にしたいですか?

4

5 に答える 5

0

新しい要素を vector にプッシュして空きがない場合、std::vector は新しい要素に追加のメモリを割り当てますが (reserve() 呼び出しと同様)、それらを作成しません (コンストラクタを呼び出しません)。これがどのように機能するかを理解するには、「新しい」配置を参照してください。新しい要素がないため、新しい要素に特定の値を強制する実際の方法はありません。将来の要素に割り当てられる生のメモリブロックのみです。operator[] の代わりに std::vector::at を使用すると、有効な範囲内の要素にアクセスしていることを確認できます。

std::vector::resizeを呼び出してベクターを自分でサイズ変更する場合は、2 番目のパラメーターで新しい要素のデフォルト値を指定するだけです。ただし、落とし穴があります。std::vector を自分でサイズ変更し、std::vector::resize の 2 番目の引数に値を指定しない場合、std::vector に格納されている値にコンストラクターがある場合、std::vector は新しい要素を値で初期化し、それらをゼロで初期化します。それ以外は。つまり、 を実行するとstd::vector<int*> v; v.resize(200);、v のすべての新しい要素がゼロに初期化されます。詳細については、この回答を参照してください。

于 2012-04-30T09:36:17.833 に答える
0

この新しいスペースは、ベクトルの容量の一部ですが、サイズの一部ではありません。とにかくアクセスが許可されていないため、含まれている値を気にする必要はありません。押し戻した 1 つの値を除いて、余分なスペースは「ベクトルの要素」ではなく、未使用のスペースです。

標準に関する限り、必要に応じて、実装はそれを使用して意味のあるものを格納できます。たとえば、実装では、未使用のメモリに目印の値を合法的に格納できますが、これは、未使用のメモリに null ポインターを含めたいという要望と矛盾します。

次のようなコードを記述できます。

v.push_back(some_value);
if (v.capacity() > v.size()) {
    size_t oldsize = v.size();
    v.resize(v.capacity(), NULL);
    v.resize(oldsize);
}

再度サイズを変更すると、実際にメモリが 0 に設定されたままになるという保証はありませんが、おそらくそうなるでしょう。したがって、デバッグには十分かもしれません。あなたが考えている目的がデバッグではない場合は、それが何であるかを教えてください。なぜなら、デバッグではない場合は、あなたの目的が違法であるか、私たちの誰かが何かを誤解しているからです。

于 2012-04-30T09:27:28.600 に答える
0

構築されていない限り、なぜNULLにする必要があるのでしょうか? たとえば、10 個のオブジェクトのベクターを作成し、そのベクターに 11 番目のアイテムを追加すると、ベクターは別の 10 アイテム用に十分なスペースを確保できますが、アイテムをベクターにプッシュしてサイズを大きくしない限り、これらのアイテムを使用することはできません。 、またはあなたが呼び出しますresize

sizeと同じではありませんcapacity

于 2012-04-30T09:28:25.010 に答える
0

なぜそれが必要なのですか?vectorとにかく、これらの要素にアクセスすることはできません。その容量の拡張はベクトルの実装の詳細であり、割り当てられたスペースの要素の値は関係ありません。これらの要素はpush_back、そこに何かがあるかresize、指定された値を持つベクトルが上書きされると上書きされます。

ベクトルのcapacityとの間には重要な違いがあります。size

于 2012-04-30T09:28:47.353 に答える
0

私があなたの質問を正しく理解していれば、簡単な解決策の 1 つは、新しく作成されたアイテムのデフォルト値として使用される2 番目の引数としてresize()自分自身を渡すことです。NULL

if (v.size() == v.capacity()) //vector is full
{
    //compute the new size
    size_t newSize = 2 * v.size();

    //second argument is the default value for newly added items
    v.resize(newSize, NULL); 
}
于 2012-04-30T09:25:21.293 に答える