1

私は最初の順序のポインターをメモリに1つずつ割り当てようとしています。2 番目のポインターは、このキューを通過し、そのポインターで作成されたオブジェクトを処理する必要があります。オブジェクトのキュー(それらへのポインターではない)を割り当てると、新しい配置が正常に機能しますが、ポインターで同じことをしようとすると問題が発生します。

int* p;

p = new int(1);
printf("%p - %d\n", p, *p);    // address of int and its value
delete p;

最初のオブジェクトが作成されて削除され、ポインタがいくつかのアドレスで初期化され、次のオブジェクトがサイクルで作成されます

p = new(p) int(2);    // (p) - memory will be allocated at address
                      // on which p points
printf("%p - %d\n", p, *p);    // address of int and its value
delete p;

p++;

p = new(p) int(3);    // (p) - memory will be allocated at address
                      // on which p points
printf("%p - %d\n", p, *p);    // address of int and its value
delete p;

出力:

01C1FFD0 - 1

01C1FFD0 - 2

01C1FFD4 - 3;

int** pp;

pp = new int*;
printf("%p\n", pp);    // address of int*
*pp = new int(1);
printf("%p - %d\n", *pp, **pp);    // address of int and its value
delete *pp;
delete pp;

pp = new(pp) int*;
printf("%p\n", pp);    // address of int*
*pp = new int(2);
printf("%p - %d\n", *pp, **pp);    // address of int and its value
delete *pp;
delete pp;

pp++;

pp = new(pp) int*;
printf("%p\n", pp);    // address of int*
*pp = new int(3);
printf("%p - %d\n", *pp, **pp);    // address of int and its value
delete *pp;
delete pp;

int が *pp によって作成されていない場合、pp がインクリメントされている場合、後で pp を削除することは現実的ではありません。int が *pp によって作成された場合、アドレスと 2 番目の値に何か問題があります。

出力:

01C1FFD0

01C1FFE0 - 1

01C1FFD0

01C1FFD0 - 29491152

01C1FFD4

01C1FFD0 - 3

このキューを正しく整理する方法についてアドバイスをいただければ幸いです。

4

1 に答える 1

1
p = new(p) int(2);    // (p) - memory will be allocated at address
                      // on which p points

ここで初めてあなたが間違っています。new(p) Tメモリを割り当てません。それどころか、 aを構築できるメモリを指していると仮定して、 Tat addressを作成するだけです。また、メモリが割り当てられていないため、このようなポインタを単に に渡すことはできません。これは、割り当てられていないストレージを解放しようとするためです。それよりも、手動でデストラクタを呼び出し、取得方法に応じてメモリを破棄する必要があります。ppTdelete

配置newはかなり高度な概念であり、現時点では必要ない可能性が非常に高いです。実際、「単純な」手動のメモリ/オブジェクト ライフタイム管理でさえ、学習のこの時点では気にするべきではないでしょう。どの本から C++ を学んでいますか? このブックリストを見たことがありますか?

参考までに: その行より下のコードは見ていません。

于 2012-11-09T16:37:53.513 に答える