3

ここを参照

そのデストラクタは、auto_ptr オブジェクトのデストラクタも暗黙的に呼び出します。そして、それが保持しているCオブジェクトを指すポインターを削除します-Cの定義を知らなくても!これは、構造体 A のコンストラクターが定義されている .cpp ファイルに表示されます。

これは興味深く、その後

5.3.5/5 は次のように述べています - 「削除されるオブジェクトが削除の時点で不完全なクラス型を持ち、完全なクラスに重要なデストラクタまたは割り当て解除関数がある場合、動作は未定義です。」

私の質問は、不完全な型へのポインターを削除しようとするようなプログラムが不正な形式として扱われないのはなぜですか? 条件付きの領域にプッシュされるのはなぜですか(そして完全なクラスには自明ではないデストラクタがあります..)「未定義の動作」ですか?

'' は何を意味しますか?

編集2:

以下のコードは整形式ですか?VS と Gcc/CLang はコンパイルしますが、Comeau は警告を出します。これはすべて、標準で言及されている未定義の動作の一部だと思います。私の質問は、「なぜこれは不正ではないのに定義されていないのか」ということです。

#include <iostream>
#include <memory>
using namespace std;

struct C;
                        // Is this the POI for auto_ptr<C>? $14.6.4.1/3
struct A{
    A();
    auto_ptr<C> mc;
    ~A(){}             // how does it link to C::~C at this point?
};

struct C{};

A::A():mc(new C){}

int main(){
    A a;
}
4

1 に答える 1

5

私がこれを書いているとき、あなたのテキストは参照なしで「参照[ここ][1]」と言っています。

しかし、基本的に、この標準では、delete不完全な型へのポインターを使用できるため、コンパイラーが持っていない知識、つまり型のデストラクタは何もしないという知識を活用できます。

std::auto_ptrこれが問題となる例です。特にPIMPLイディオムの場合です(これを間違えた悪名高い例は、PIMPLでのハーブサッターのGOTWで、彼は誤って使用していましたstd::auto_ptr)。boost::shared_ptr(一般的に)問題にならない例です。これは、のコンストラクターがboost::shared_ptr削除関数を格納するためであり、ポインティの完全なタイプは、構築の時点で必ずわかっている必要があります。

乾杯&hth。、

于 2010-10-18T06:09:32.233 に答える