0

C++ を使用してガベージ コレクション ライブラリを作成しています。そこでは、オブジェクトのデストラクタがファイナライザとして機能し、オブジェクトのメモリが解放されるときにオブジェクトの内部データを解放します。ポインタ アドレスは、セット ( std::set) に符号なし整数として格納されます。

std::set<unsigned int> addresses;

C1* c1 = new C1();
C2* c2 = new C2();

addresses.insert(*c1);
addresses.insert(*c2); // so now pointer's addresses are stored in the set

オブジェクトを解放する必要がある場合は、デストラクタを呼び出したい:

std::set<unsigned int>::iterator it = addresses.begin(); // for example delete the first one
/* 1st variant */ delete *it; // not working, because "unsigned int is not a pointer type"
/* 2nd variant */ delete (void*)(*it); // frees memory, but doesn't call the destructor.

私が知っている唯一のことが符号なし整数として格納されているそのアドレスである場合、原則としてオブジェクトのデストラクタを呼び出すことは可能ですか?

設計段階でミスをしたのではないでしょうか?オブジェクトにはさまざまな型があり、必要に応じてメモリを解放するためにアドレスを保存する必要がありますが、それらのデストラクタも呼び出す必要があります。どうすればこれに対処できますか?

4

2 に答える 2

3

うーん、void*ではなくを使用unsigned intしますが、既知の型を持つポインターが型に関する情報を持たないコンテナーに格納されたときに破棄された情報を取り戻すのには役立ちません。要するに、型指定されたポインターまたは何らかの形式の外部情報を使用して、ポイント先のオブジェクトの型に関する情報を保存しない限り、それを削除することはできません。

于 2013-11-14T13:24:18.780 に答える
1

私が知っている唯一のことが符号なし整数として格納されているそのアドレスである場合、オブジェクトのデストラクタを呼び出すことは原則として可能ですか?

いいえ、オブジェクトのタイプがわからないためです。

すべてのオブジェクトが、仮想デストラクタを使用して CollectableObject 基本クラスから継承されている場合は、std::set<CollectableObject*> objects.

于 2013-11-14T13:24:59.530 に答える