1

ドクタークラスを含むプログラムがあり、各ドクターオブジェクトには「患者」のリンクリストがあります。これらの患者は、次のコード行を使用して作成されます

Patient * patient = new Patient(string firstname, string ailment);

そして、この患者は医師のリンクされたリストに追加されます。Doctor クラスには、リストを参照して反復処理し、各患者を取得するために使用されるポインターがあります。これらの患者を削除したいときは、リストの先頭から始めて、各患者を反復処理する必要があります。私の質問は、反復処理中にデストラクタを呼び出すだけで eacg 患者を削除できますか?

Patient::~Patient(){

}

または、各従業員を指しているときに、ポインターで実際に delete を呼び出す必要がありますか?

4

5 に答える 5

9

delete物を削除するために 呼び出します。delete次に、オブジェクトのデストラクタが呼び出されます。

クラスのデストラクタを直接呼び出すことは C++ でサポートされており、実際にはいくつかのまれなシナリオで役立ちますが、実際にはメモリの割り当てを解除しません。これは、ここでやりたいことではありません。

于 2012-10-09T17:41:56.797 に答える
5

まず、newポインターを返すので、Patient* patient = ....

それはさておき、はい、delete割り当てたものすべてを呼び出す必要がnewあり、デストラクタが呼び出されます。

OR (ドラムロール)std::unique_ptr代わりに a を使用します。そして、あなたが患者のリストを持っていると言うとき、それはあなたが患者のリストを持っていることを意味することを願っていますstd::list.

于 2012-10-09T17:42:06.423 に答える
2

を呼び出すdeleteと、実際にオブジェクトのデストラクタが呼び出されます。

于 2012-10-09T17:42:00.397 に答える
1

各患者オブジェクトにメモリを動的に割り当てているため(そうでPatient* patientある必要があります...)、各オブジェクトの割り当ても手動で解除する必要があります...

詳細については、このwikiページを参照してください。

于 2012-10-09T17:43:09.807 に答える
1

私の知る限り、各ポインタで個別に削除を呼び出す必要があります。患者デストラクタ内から患者へのポインタを削除することは、クラスを使用する目的に違反しているようです (つまり、それらは自己完結型であり、外部の世界にアクセスできません)。

于 2012-10-09T17:43:47.707 に答える