2017-06-07 3 views
1

voidポインタの削除情報をこのような関数ポインタに格納することは正当でしょうか?デストラクタ情報をvoidに格納する正当な方法*

typedef void(*deleter)(void*); 
template <class T> void deleteVoidPointer(void* target) 
{ 
    delete static_cast<T*>(target); 
} 

int main() 
{ 
    void* p = new int; 
    deleter del = deleteVoidPointer<int>; 

    del(p); 
    return 0; 
} 

私がここで行方不明ですかこれはポインタのためのデストラクタ情報を追跡するための合法的な方法である任意の副作用はありますか? (ターゲットがdeleteVoidPointerのnullptrであるかどうかのチェックがないことに加えて)

+4

* "targetがdeleteVoidPointerのnullptrであるかどうかのチェックがありません" *。ヌルポインタの削除は、no-opとして有効です。 – Jarod42

+0

この予期しない構成の目的は何ですか?演算子 'delete'は静的キャストを元に戻すように' void * 'を想定していますが、異なる' T'のために異なる 'deleter'アドレスを取得しますが、それらは完全に互換性があります。 'deleteVoidPointer (p);'もうまくいきます。どのタイプ情報も格納していません。 –

+0

@ YvesDaoustもし私が誤解されていないなら、デストラクタを呼び出さなければならない多態性クラスを扱うときには当てはまりません。 void *を使用して削除すると、予期しない結果につながる可能性があります。 – DeiDei

答えて

2

はい、あなたが示したコードは完全に有効です。

ヌルポインタでdeleteを呼び出しても何も起こらないことが保証されています。

関連する問題