このコードがどのようにメモリアクセス違反を引き起こすのか疑問に思いましたか?
{
Vector3f *a = new Vector3f [10];
Vector3f *b = a;
b[9] = Vector3f (2,3,4);
delete[] a;
a = new Vector3f [10];
b[4] = Vector3f (1,2,3);
delete[] a;
}
このコードがどのようにメモリアクセス違反を引き起こすのか疑問に思いましたか?
{
Vector3f *a = new Vector3f [10];
Vector3f *b = a;
b[9] = Vector3f (2,3,4);
delete[] a;
a = new Vector3f [10];
b[4] = Vector3f (1,2,3);
delete[] a;
}
それでも、を呼び出したときb
と同じ配列を指しているため、そのメモリを。で使用しようとします。a
delete[] a
b[4]
Vector3f *a = new Vector3f [10]; // a initialised to a memory block x
Vector3f *b = a; // b initialised to point to x also
b[9] = Vector3f (2,3,4); // x[9] is assigned a new vector
delete[] a; // x is deallocated
a = new Vector3f [10]; // a is assigned a new memory block y
b[4] = Vector3f (1,2,3); // x is used (b still points to x)
// x was deallocated and this causes segfault
delete[] a; // y is deallocated
この行:
b[4] = Vector3f (1,2,3);
b
まだ古い、解放されたを指していa
ます。
b
最初に削除されたa
(つまりb
、新しく割り当てられた a
)を指しているので、それが指しているメモリを削除した後で再利用しようとするとb
、未定義の動作が呼び出され、この場合、メモリアクセス違反。