0

このコードがどのようにメモリアクセス違反を引き起こすのか疑問に思いましたか?

{
   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;
}
4

3 に答える 3

5

それでも、を呼び出したときbと同じ配列を指しているため、そのメモリを。で使用しようとします。adelete[] ab[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
于 2012-05-13T20:19:18.433 に答える
3

この行:

b[4] = Vector3f (1,2,3);

bまだ古い、解放されたを指していaます。

于 2012-05-13T20:19:32.517 に答える
3

b最初に削除されたa(つまりb新しく割り当てられた a)を指しているので、それが指しているメモリを削除した後で再利用しようとするとb、未定義の動作が呼び出され、この場合、メモリアクセス違反。

于 2012-05-13T20:19:48.833 に答える