1

ポインタの配列があります。pArray[rows][columns]ここで、各要素にはオブジェクトへのポインタを含めることができます。一部のオブジェクトはmain()ヒープ上でインスタンス化され、一部はヒープ上でもオブジェクト自体によってインスタンス化されました。つまりpArray、オブジェクトメンバー関数に渡され、その関数が新しいオブジェクトを作成し、そのオブジェクトへのポインターをに配置しましたpArray

オブジェクトへのポインタをから削除したい場合pArray、ここで所有権はありますか?つまり、オブジェクトが新しいオブジェクトを作成し、そのオブジェクトへのポインタをに配置した場合pArray、作成者オブジェクトのみがそのポインタに対してdeleteを呼び出すことができますか?またはmain()、配列をそれらに渡すことによって、および他のオブジェクトからそれを行うことができますか?

詳細:

このコードは、グリッド上の捕食者の被食者モデルをシミュレートします(pArray)。そこで、ファイルから初期グリッド構成を読み取ることから始め、からオブジェクト(捕食者と被食者)をインスタンス化しpArrayますmain()。しかし、捕食者と獲物は繁殖する可能性があるため、オブジェクトは新しいオブジェクトを生成pArrayし、それらに渡すことで、に子をインスタンス化しますpArray

4

4 に答える 4

5

生のポインタでは、所有権は純粋に概念です。生のポインタを使用している限り、ポイントされたオブジェクトの所有権を誰にでも割り当てるのは完全にあなた次第です。それはあなたのデザインの問題です。オブジェクトを作成した人がオブジェクトを削除する必要があるという「ルール」はありません。所有権は保持または譲渡できます。所有権は共有できます(参照カウント所有権スキームのように)。繰り返しますが、それはあなたのデザインとあなたの意図の問題です。

さまざまなスマートポインタクラスは、意図を表現し、意図を実装するのに役立ちます。生のポインタを使用すると、誰が何を所有しているかを覚えて、すべてを手動で行う必要があります。

于 2012-07-07T17:37:33.233 に答える
2

いいえ、C ++のポインターには「所有権」はありません。ポインターが有効な場合(データ/オブジェクトへの適切な参照が含まれている場合)、コマンドを発行してどこにでも割り当てを解除できますdelete

于 2012-07-07T17:26:25.660 に答える
1

オブジェクトのデストラクタは、他のすべてのメソッドと同じパブリック/保護/プライベートの対象になります。したがって、デストラクタがパブリックである場合、誰でもオブジェクトに対してdeleteを呼び出すことができます。

唯一の重要なことは、それが1回だけ発生し、誰もそのオブジェクトを使用しなくなった後でのみ発生することです。

于 2012-07-07T17:28:53.707 に答える
1

C ++にはポインタの所有権の概念はありません。あなたの質問を理解している限り、動的メモリ割り当ての場合は、そのオブジェクトをmain()から削除できます。そのオブジェクトに割り当てられたメモリは、プログラムが終了するか、Object配列がスコープ外になり、クラスのデストラクタが呼び出された場合にのみ解放されます。

于 2012-07-07T17:29:27.390 に答える