私はデータ(例えばD)をオブジェクト(例えばO)に関連付けるクラス(例えばC)を作成しています。 Oが破壊されると、OはCにすぐには存在しなくなることをCに通知します。(...その後、Cが適切な時間であると感じると、CはOに属するもの、すなわちDを放棄します。オブジェクトが存在しなくなった後、オブジェクトに関連付けられたデータをどのように破棄するのですか?
If Dはどんなタイプのオブジェクトでもかまいませんが、Cが "delete D;"を実行するための最良の方法は何ですか?そしてDがオブジェクトの配列である場合はどうなりますか?
私の解決策は、
voidポインタを格納してdeleteを呼び出すことも考えましたが、これは未定義の動作であり、呼び出さないことがわかりました。私はテンプレートが斬新な解決策であると考えましたが、私はその考え方をうまく働かすことができませんでした。
は、ここで私はCのために、これまで持っているものだ、マイナスいくつかの詳細:
// This class is C in the above description. There may be many instances of C.
class Context
{
public:
// D will inherit from this class
class Data
{
public:
virtual ~Data() {}
};
Context();
~Context();
// Associates an owner (O) with its data (D)
void add(const void* owner, Data* data);
// O calls this when he knows its the end (O's destructor).
// All instances of C are now aware that O is gone and its time to get rid
// of all associated instances of D.
static void purge (const void* owner);
// This is called periodically in the application. It checks whether
// O has called purge, and calls "delete D;"
void refresh();
// Side note: sometimes O needs access to D
Data *get (const void *owner);
private:
// Used for mapping owners (O) to data (D)
std::map _data;
};
// Here's an example of O
class Mesh
{
public:
~Mesh()
{
Context::purge(this);
}
void init(Context& c) const
{
Data* data = new Data;
// GL initialization here
c.add(this, new Data);
}
void render(Context& c) const
{
Data* data = c.get(this);
}
private:
// And here's an example of D
struct Data : public Context::Data
{
~Data()
{
glDeleteBuffers(1, &vbo);
glDeleteTextures(1, &texture);
}
GLint vbo;
GLint texture;
};
};
P.S.あなたがコンピュータグラフィックスやVRに慣れているならば、オブジェクトごとのコンテキストデータ(OpenGL VBO IDなど)をアプリケーションごとのデータ(頂点の配列など)から分離し、コンテキストごとに解放するクラスを作成しています(該当するレンダリングコンテクストが現在のものである)適切な時点でのデータ。
ありがとうございます。 私のプログラムには、更新スレッドとレンダリングスレッドがあります。レンダリングスレッドは、各目に対してステレオ画像を作成するために2回レンダリングを担当します。各3DオブジェクトOは、各コンテキスト(すなわち、O毎に2つのDのコピーがある)について目に特有のレンダリングデータDを有する。 問題:更新スレッドでOを作成または破棄することはできますが、Oの目に固有のレンダリングデータは、レンダリングスレッドで破棄する必要があります。 Cは、レンダリングスレッドでDの両方のインスタンスを破壊することがわかるように、Oが破壊されているかどうかを知る必要があります。 –