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++ 側では、演算子new
、new[]
、delete
およびが、標準とバージョンdelete[]
の両方でグローバルにオーバーロードされています。throw ()
今私の質問:
- の呼び出し中に C 部分がカスタム関数に割り当てられたすべてのメモリを解放する場合、実際に割り当てられたすべての
pluginFunction
メモリを解放しますか、または のバリアントによって提供されるメモリ以上のものがありますか?new
- 適切なデストラクタへの呼び出しをバイパスすることによって、さらにどのような害が生じるでしょうか? その害は、C++ 側だけで回避できます
pluginFunction
か? - 潜在的な落とし穴や副作用はありますか?
呼び出し元の C プログラムにはアクセスできないことに注意してください。ただし、提供されたインターフェイスを使用する必要があります。したがって、メモリが適切に解放され、最善を尽くすようにメモリを調整する以外に選択肢はありません。