[expr.delete] n3242で:
[...]
第2の代替案(の削除 の配列)、オペランドの値が の場合、NULLポインタの値または の場合は、以前の配列new-expressionの からのポインタ値になります。 でない場合、動作は未定義です。 [...]
私は、delete[] p
ため、p
がここにリストされていないoperator new
の結果として見てフォームnew[] p
(新しい表現)、または0の何かの結果であったに違いないことを意味しています最初のケースが正しいと思います。
私は第2のケースがOKであると信じています。 18.6.1.2 [new.delete.array]から :
void operator delete[](void* ptr) noexcept;
[...]
が必要です: ptrがNULLポインタでなければなりません またはその値は、 オペレータnewまたはへの前回の呼び出しによって返された値 でなければなりませんオペレータの削除 への介入によって無効にされた ではないoperator new [](std :: size_t、const std :: nothrow_t &)です。 [...]
ように長いデ/割り当て関数が一致するように(例えばdelete[] (new[3] T)
(3.7.4.2で同様のテキスト[basic.stc.dynamic.deallocation]、段落3があります)よく形成される)何も悪いことは起こらない。 [それとも?私はジェリーは5.3.4 [exprの中で、約警告されているものの規範的なテキストを追跡考える
]以下を参照してください。]新しい:
新しい式は、型 のstd :: size_t型の第1引数として割り当て 機能に要求 スペースの量を通過させます。その引数は であるオブジェクトのサイズより小さい でなければなりません。オブジェクトが配列の場合は、 オブジェクトのサイズよりも大きくなる場合があります( )。 [...]同じ段落に続いて
は、実装の新しい表現が実際に配列がとるスペースよりも割り当て関数からより多くのを聞いていないことを強調する例(その非規範的)であります(割り当て解除機能で利用可能なオプションのstd::size_t
パラメータを格納することを念頭に置いてください)、それらが結果にオフセットすることができます。だから、すべての賭けは配列の場合にはオフです。しかし、配列以外の場合はうまくいくようです:
auto* p = new T;
// Still icky
p->~T();
operator delete(p);
たとえ動作していても(私はこれを疑う)。それはコードを維持できないものにします。クラスXへの変更(operator newの追加など)は、少なくともテストの目的で上記のコードについて知る必要があります。このXの使用法がXの実装に強く結合することは望ましくない。 –