0

次の文章を含むいくつかのコードを継承しました。

TStringList* pPortList(NULL);
pPortList = FindCommPorts();
ConnectionDialog->PortList = pPortList;
int nModalReturn = ConnectionDialog->ShowModal();
delete pPortList;

FindCommPorts()を作成しnew TStringList()、入力して返す関数です。

コードを次のように置き換えてみたくなりました。

ConnectionDialog->PortList = FindCommPorts();
int nModalReturn = ConnectionDialog->ShowModal();

しかし、私は C++ の所有権のセマンティクスに十分に精通していないことに気付きました。の結果がdにFindCommPorts()ならないため、メモリ リークが発生しますか?delete

編集:コードをもう一度見てみると、元のバージョンではポインターがハングしているとは思いません。ConnectionDialog->PortList実際にはプロパティであることがわかりました (私は Borland C++Builder 6 を使用しています)。このプロパティには、文字列を からコピーするカスタム セッターがTStringListあり、渡されたポインター自体はその後使用されません。これについて先に言及しなかったことをお詫びします。コードの書き方からすれば、間違いなく見栄えが悪いのです。

4

1 に答える 1

1

d でない場合はdelete、はい、メモリ リークが発生します。ただし、このコードの問題はさらに深刻です。あなたの状況を次のように考えてください。

  • FindCommPorts()ポインタを返します
  • ConnectionDialog->PortList結果が指すのと同じメモリを指すように指示FindCommPorts()します。
  • 次に、指してdeleteいるメモリのオブジェクトを指します。これは、指しているメモリと同じです!pPortListConnectionDialog->PortList

この後、PortList変数は削除されたメモリを指しているので、アクセスしないでください。FindCommPorts()このポインターを再度使用する必要がある場合でも、削除しないでください。そのため、 の結果を に直接代入することを心配する必要はありませんConnectionDialog->PortList。使い終わったら必ず削除してください。

そのポインタが永久に有効である必要がある場合、データが必要であるため、この状況はメモリ リークではありません。その場合、メモリはプログラムの終了時に解放されます。

編集

あなたの質問の編集を読んだ後、あなたが正しいことがわかりました。メモリリークを防ぐために一時変数が必要です。これを行わないと、プロパティのセッターは、によって返されるポインターが指すオブジェクトのコピーを作成しFindCommPorts()、メモリーは割り当てられたままになりますが、それを指すポインターを含む変数はありません。この場合、一時変数を作成し、割り当てを行った後に削除するのは正しいことです。

于 2013-06-20T19:23:39.020 に答える