4

バイナリ互換インターフェイス (共有ライブラリとして使用される) を実装する C++ クラスがあるため、C 型のみが返されます。const char* としての文字列、void ポインター、およびバイナリー互換インターフェースを持つ他のクラスへのポインター。問題は、メモリ管理をどのように整理するか、既存のクラス データへの定数ポインタを返すか (ユーザーが古いポインタを使用する危険性があります)、そこにあるメモリを自分で解放するか、またはいくつかのヒープ変数へのポインタを解放し、それらのポインタを削除する責任をユーザに負わせるかです。後で、または??? そのための一般的なガイドラインはありますか?

4

7 に答える 7

5

C インターフェイスを使用する「バイナリ互換インターフェイス」では、共有ヒープを想定しません。したがって、ヒープからメモリを割り当てる側は、メモリをそのヒープに戻す側です。

1 つのヒープからブロックを割り当て、C インターフェースを介して渡し、反対側にブロックを渡すと、壮大な障害やサイレント破損が発生する可能性がありますdelete

于 2012-03-01T15:01:22.680 に答える
1

メモリの割り当てと解放を呼び出し元に任せます。

于 2012-03-01T14:55:02.420 に答える
1

どちらも、明確かつ完全に文書化されている限り、実稼働環境で受け入れられ、使用されます。

于 2012-03-01T14:55:13.623 に答える
1

これは本当にあなた次第です。

オブジェクト指向の優れたアプローチは、クラス自体でメモリを管理することです。OOP の利点の多くは、機能を可能な限りカプセル化することです。そのため、メモリはクラスによって管理されているため、メモリがどのように割り当てられたり解放されたりするかを気にすることなく、コードがクラス メソッドを呼び出せるように設計できます。

ただし、メモリが不要になったことをクラスが知る良い方法がないため、このアプローチがうまくいかない場合があります。このような場合は、呼び出し元にメモリを割り当てる (後で解放する) か、割り当てられてクラスから返されたメモリを呼び出し元が解放する必要があることを単に規定することができます。

それは両方の方法で行われます。ここには厳密なルールはありません。

于 2012-03-01T14:55:22.777 に答える
0

呼び出し元には、データを解放する責任があると言えます。newまた、呼び出し元が C++ アプリケーションでない場合は使用できないことに注意してください。

于 2012-03-01T14:57:05.693 に答える
0

既存の API に書き込んでいる場合は、その API が必要とすることは何でも行います。この件に関して、あなたには選択の余地がありません。API は誰が何を担当するかを指定しており、API の反対側のコードは実装が準拠することを期待しています。

于 2012-03-01T15:29:07.117 に答える
0

可能であれば、unique_ptr や shared_ptr などのスマートポインターを使用してください。(私の理解が正しければ、既に C 関数をラップしているので問題ありません。)

于 2012-03-01T14:56:17.887 に答える