2

を使用せずにクラスタイプを知らなくてもオブジェクトのデストラクタを呼び出すことは可能deleteですか?私はアロケータ(楽しみ/練習用)に取り組んでいて、オブジェクトをコンストラクターするためにmalloc/配置を使用しているので質問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;
}

(削除を呼び出すことができることはわかっていますが、今のところ無視してください。)

4

3 に答える 3

2

いいえ、コンパイラはどのデストラクタを呼び出すかを知らないため、クラスを知らずにデストラクタを呼び出すことはできません。次のいずれかを実行できます。

  • すべてのオブジェクトが仮想デストラクタを持つベースオブジェクトから継承するようにし、voidポインタの代わりにそのベースオブジェクトポインタを使用します
  • テンプレートを利用する
  • アロケータ自体がコンストラクタ/デストラクタの呼び出しを管理しないようにします
于 2012-04-18T23:52:29.103 に答える
2

型なしでコンストラクタを呼び出す(つまり、新しい配置)よりも、型なしのメモリでデストラクタを呼び出すことはできません。コンストラクタとデストラクタはどちらもオブジェクトの一部であり、コンパイラには何を呼び出すかを知るための型が必要です。

于 2012-04-18T23:52:37.007 に答える
2

いいえ、タイプを知らなければ(または、仮想デストラクタを持つオブジェクトの基本タイプの1つを知らなければ)不可能です。

通常、カスタムアロケータはオブジェクトを構築も破棄もしませんが、新しい配置または直接のデストラクタ呼び出しを実行するアロケータの周りにテンプレート化されたラッパーを作成するものもあります。

(技術的には、すべての割り当てに、型のデストラクタを呼び出す関数ポインタを関連付けることができます。しかし、それはかなり大雑把なので、お勧めしません。)

于 2012-04-18T23:52:40.107 に答える