delete
を使わずに、クラスの種類を知らなくてもオブジェクトのデストラクタを呼び出すことはできますか?私はアロケータ(楽しい/練習用)に取り組んでいるので、コンストラクタにオブジェクトを構築するのにmalloc
/placement new
を使用していますが、オブジェクトを破棄するときには、タイプを知っている。それが不可能な場合は、どうしてですか?唯一の方法は、サンプルコード(コメントアウトされている)に表示される方法ですか?型を知らなくてもデストラクタを呼び出すことはできますか?
#include <stdio.h>
#include <new>
void* SomeAllocationFunction(size_t size) {
return malloc(size);
}
class SomeClass{
public:
SomeClass() {
printf("Constructed\n");
}
~SomeClass() {
printf("Destructed\n");
}
};
int main(void){
void* mem = SomeAllocationFunction(sizeof(SomeClass));
SomeClass* t = new(mem)SomeClass;
free(t);
//t->~SomeClass(); // This will call the destructor, is it possible to do this without knowing the class?
return 0;
}
(私はちょうど削除を呼び出すことができます知っているが、一瞬のためにそれを無視してください。)
クラス固有を呼び出すための唯一の方法(vtblのコンセプトと同様に)実行時にルックアップを実行するために使用できる、すべてのインスタンスに組み込まれたクラス固有の情報があるかどうかです。それは一般的にそうではありません。 –
't->〜SomeClass()'を呼んでしまうと、間違いなく* * 'free(t)'の前に*したいと思うでしょう。 –
@Greg Hewgill:それはちょうどコメントされたコードだった、私は注文と混同するつもりはなかった。 – mmurphy