1

C++ で書かれたコードを呼び出す C プログラムがあるとします。もう少し具体的にすると、これは次のようになります。

// C++:
extern "C" void * pluginFunction(void * input) {
    result = (SomeObject *) input;
    if (! result)
        SomeObject * result = new SomeObject();

    // Do something really intelligent here.
    return (void*) result;
}

呼び出し元の C プログラムの場合:

int main() {
    void * result;
    while (something) {
        result = pluginFunction(result);
        // some more things
    }

    // Cleanup memory
}

さらに、C プログラムがカスタム メモリ管理を提供するとします。custom_allocしたがって、C プログラムは、提供された関数とcustom_freeを使用してどのメモリが割り当てられたかを常に認識していますcustom_realloc

C++ 側では、演算子newnew[]deleteおよびが、標準とバージョンdelete[]の両方でグローバルにオーバーロードされています。throw ()

今私の質問:

  • の呼び出し中に C 部分がカスタム関数に割り当てられたすべてのメモリを解放する場合、実際に割り当てられたすべてのpluginFunctionメモリを解放しますか、または のバリアントによって提供されるメモリ以上のものがありますか?new
  • 適切なデストラクタへの呼び出しをバイパスすることによって、さらにどのような害が生じるでしょうか? その害は、C++ 側だけで回避できますpluginFunctionか?
  • 潜在的な落とし穴や副作用はありますか?

呼び出し元の C プログラムにはアクセスできないことに注意してください。ただし、提供されたインターフェイスを使用する必要があります。したがって、メモリが適切に解放され、最善を尽くすようにメモリを調整する以外に選択肢はありません。

4

2 に答える 2

1

ルールは非常に単純です。メモリを割り当てた場所でメモリを破棄する必要があります。したがって、プラグイン インターフェイスは、割り当て関数と割り当て解除関数の両方を提供する必要があります。

于 2013-03-05T06:35:24.323 に答える
1
  1. C++ 関数は、malloc() または malloc() を呼び出す可能性のあるその他の標準 C ライブラリを呼び出すこともできるため、new と delete をオーバーライドするだけでは不十分な場合があります。また、malloc、calloc などをオーバーライドする必要があります。

  2. C++ コードは、ハードウェア、ソケット、ファイルなどを開くなど、デストラクタで初期化解除が必要な他の初期化を行う場合があります。そのため、副作用が発生する可能性があります。

  3. 2を参照してください。

于 2013-03-05T07:03:06.747 に答える