ベクトルが無効なメモリへのポインタを含むことは違法です
これは、コンテナの内容について標準が述べなければならないことです。
(23.3) : これらのコンポーネントに格納されるオブジェクトの型は、CopyConstructible型 (20.1.3) の要件と、Assignable 型の追加要件を満たす必要があります。
(20.1.3.1, CopyConstructible) : 次の表 30 で、T はテンプレートをインスタンス化する C++ プログラムによって提供される型であり、t は型 T の値であり、u は型 const T の値です。
expression return type requirement
xxxxxxxxxx xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
T(t) t is equivelant to T(t)
T(u) u is equivelant to T(u)
t.~T()
&t T* denotes the address of t
&u const T* denotes the address of u
(23.1.4、Assignable) : 64、T はコンテナーのインスタンス化に使用される型、t は T の値、u は (場合によっては const) T の値です。
expression return type requirement
xxxxxxxxxx xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
t = u T& t is equivilant to u
STL コレクションの内容については以上です。ポインターについては何も述べておらず、有効なメモリを指すポインターについては特に沈黙しています。
したがって、 でdelete
ポインターを ing することは、vector
おそらく非常に悪いアーキテクチャ上の決定であり、土曜日の夜の午前 3 時にデバッガーを使用して痛みと苦しみを招くことになりますが、完全に合法です。
編集:
「無効なポインター値にポインターを割り当てると、未定義の動作が発生する」という Kranar のコメントについて。いいえ、これは正しくありません。このコードは完全に有効です:
Foo* foo = new Foo();
delete foo;
Foo* foo_2 = foo; // This is legal
foo
違法なのは、そのポインター (または、さらに言えば) で何かをしようとすることです。
delete foo_2; // UB
foo_2->do_something(); // UB
Foo& foo_ref = *foo_2; // UB
ワイルド ポインターを作成するだけでも、標準に従って合法です。おそらく良い考えではありませんが、それでも合法です。
EDIT2:
ポインター型に関する標準からの詳細。
したがって、標準(3.9.2.3)は次のように述べています。
... オブジェクト ポインター型の有効な値は、メモリ内のバイトのアドレス (1.7) または null ポインター (4.10) のいずれかを表します...
...そして「メモリ内のバイト」(1.7.1)に関して:
C++ メモリ モデルの基本的な記憶単位はバイトです。1 バイトは、少なくとも基本的な実行文字セットの任意のメンバーを格納するのに十分な大きさであり、一連の連続したビットで構成されており、その数は実装によって定義されています。最下位ビットは下位ビットと呼ばれます。最上位ビットは上位ビットと呼ばれます。C++ プログラムで使用できるメモリは、1 つまたは複数の連続したバイト シーケンスで構成されます。すべてのバイトには固有のアドレスがあります。
Foo
そのバイトが生活の一部であること、あなたがそれにアクセスできること、またはそのようなものについては、ここには何もありません。メモリ内の単なるバイトです。