14
// Destructor.  If there is a C object, delete it.
// We don't need to test ptr_ == NULL because C++ does that for us  

    ~scoped_ptr() {
       enum { type_must_be_complete = sizeof(C) };
       delete ptr_;
    }

注: C はテンプレート パラメータです。

null ポインターを削除できないことはわかっています。例外が発生します。したがって、この場合、列挙定義はそれを防ぐために何かをしている必要があります。本番環境では、null ポインターがあるため、プログラムを単純に終了したくない場合があります。ポインターが null の場合は、別のシナリオを検討したい場合があります。そして、このコードは本番環境でほぼどこでも使用されていますか?

みんなありがとう。

4

2 に答える 2

17

これは事実上、削除に対する静的アサーションです。実装は、前方宣言ではなく、変数を削除する前に宣言が可視である型を扱っているかどうかを知りたがっています。

不完全な型のサイズをコンパイラに尋ねると、コンパイラはエラーを出力します。

struct S;
enum { Size = sizeof(S) };

アップデート

あなたのコンパイラと Matthieu M. が教えてくれるように -- delete-ing 不完全な型は未定義です。

于 2012-04-23T07:48:36.940 に答える
0

ブーストchecked_deleterの方が良いようです:

template<class T> struct checked_deleter
{
    typedef void result_type;
    typedef T * argument_type;
    void operator()(T * p) const;
};

T が定義されていないときに 0 を返すコンパイラがあるため、その場合

enum { type_must_be_complete = sizeof(T) };

は有効な静的アサートですが、checked_deleter は失敗します。

http://www.boost.org/doc/libs/1_59_0/libs/core/doc/html/core/checked_delete.html#core.checked_delete.checked_deleter

于 2015-09-23T06:35:10.610 に答える