私の質問の本質はこれです:
ac関数で新しいオブジェクトを作成し、その新しいオブジェクトへの参照を呼び出し元に渡すための最良のアプローチは何ですか?
私の全体的な設定はもう少し複雑で、cとc ++のコードが混在しているため、いくつかの背景情報を含めています。
3Dエンジン用のc++ライブラリを作成しています。このライブラリは、さまざまなプラットフォームのホストアプリケーションから使用することを目的としています。
互換性を簡単にするために、プレーンcのAPIの背後にあるすべてのc++コードを非表示にするつもりです。これは今のところかなりうまく機能しています。
よくわからないのは、cAPIを使用してエンジンインスタンスを実際に作成するための最良の方法です。
私の最初のアプローチはこれでした:
// in myEngineAPI.h
void myEngineCreate(void * myEngine);
void myEngineRelease(void * myEngine);
// in myEngineAPI.cpp
#include "myEngineAPI.h"
#include "myPrivateCppEngine.h"
void myEngineCreate(void * myEngine) {
myEngine = new Engine; // <- this doesn't seem to work as expected
}
void myEngineRelease(void * myEngine) {
delete ((Engine *)myEngine);
}
// in my host application
#include "myEngineAPI.h"
void * myEngine = NULL;
myEngineCreate(myEngine); // <- problem: myEngine is still NULL after this line.
// ...draw some fancy stuff...
myEngineRelease(myEngine);
myEngineCreate(void * myEngine)
新しく作成したオブジェクトのアドレスがに割り当てられると思いますmyEngine
。ただし、関数が戻った後myEngine
も、NULLを指します。なんで?
今私の2番目のアプローチはこれでした:
// in myEngineAPI.h
void * myEngineCreate();
void myEngineRelease(void * myEngine);
// in myEngineAPI.cpp
#include "myEngineAPI.h"
#include "myPrivateCppEngine.h"
void * myEngineCreate() {
return new Engine; // <- ok, the function returns a valid pointer
}
void myEngineRelease(void * myEngine) {
delete ((Engine *)myEngine);
}
// in my host application
#include "myEngineAPI.h"
void * myEngine = myEngineCreate(); // <- yay, I have a void pointer to my engine
// ...draw some fancy stuff...
myEngineRelease(myEngine);
これは機能します。myEngineCreate()
エンジンインスタンスへの不透明なポインタが表示されます。これは、後続の描画呼び出しで使用でき、使い終わったときにメモリをクリーンアップするリリース関数に渡すこともできます。このアプローチの問題は、私のプロファイラーがでのメモリリークについて不平を言うことmyEngineCreate()
です。ある場所でオブジェクトを作成し、別の場所でそれを所有することはデリケートなビジネスであることを理解しています。ここで何か間違ったことをしているようですが、どうでしょうか。
アドバイスや助けを事前に感謝します。