0

残念ながら、私は自分で開発したプログラムに完全に取り組んでいません。最近、unordered_setへのポインターの単純な挿入から呼び出されたunordered_setの演算子でVisualStudioの致命的なエラーに気づきました。ローカルを確認した後、セットには2つの要素しかなく、最後の要素がNULLであることに気付きました(したがって、それがクラッシュしたと思います)。ここで質問に移ります。unordered_set(または他のSTLコンテナ)がその要素の1つとしてNULLポインタを(理論的に)取得するにはどうすればよいですか。プログラムはマルチスレッドですが、私のレビューによると、コードのその部分には1つのスレッドからのみアクセスする必要があります。ありがとう。

興味のある人のためにスタックとソースコードの一部を呼び出します: http://privatepaste.com/c8e7f35a4e(PushToProcessedはオブジェクト自体から呼び出され、それ自体への参照を渡すため、NULLにすることはできません)

4

3 に答える 3

6

セットには、NULL になる可能性のあるポインターを含めることができます。

#include <iostream>
#include <vector>

int main () {
    std::vector<int *> foo;
    foo.push_back (NULL);
    std::cout << foo.size () << std::endl;
    return 0;
}

コンテナーには簡単に NULL 値を含めることができます。コンテナの内部がめちゃくちゃになることについて話しているのですか?

于 2010-01-14T21:17:41.343 に答える
4

NULL は完全に有効なポインター値です。NULL が渡された場合は、メモリ アドレスと同様に扱われます。2 つのエントリしか表示されていないので、実際に表示されているのは、多くの NULL ポインターがセットに「追加」されていることだと思いますが、セットであるため、保持されるコピーは 1 つだけです。

編集:

多くのアイテムがすべて NULL 値で追加されるという私の仮説をテストするために、「アドレス = で追加された新しいアイテム」というポインターの値を示す単純な呼び出しを cout に入れてみませんか。きっと驚かれることでしょう。

于 2010-01-14T21:16:16.090 に答える
1

(*iter) = NULL のように、逆参照された非定数反復子を介してコンテナー ポインター値を設定できると思います。これはもちろん悪いことです。

于 2010-01-14T21:43:30.790 に答える