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であるかどうかのチェックがないことに加えて)
* "targetがdeleteVoidPointerのnullptrであるかどうかのチェックがありません" *。ヌルポインタの削除は、no-opとして有効です。 – Jarod42
この予期しない構成の目的は何ですか?演算子 'delete'は静的キャストを元に戻すように' void * 'を想定していますが、異なる' T'のために異なる 'deleter'アドレスを取得しますが、それらは完全に互換性があります。 'deleteVoidPointer(p);'もうまくいきます。どのタイプ情報も格納していません。 –
@ YvesDaoustもし私が誤解されていないなら、デストラクタを呼び出さなければならない多態性クラスを扱うときには当てはまりません。 void *を使用して削除すると、予期しない結果につながる可能性があります。 – DeiDei