このコードは明らかに機能しないため、違法であるべきだと確信していますが、C++0x FCD では許可されているようです。
class X { /* ... */};
void* raw = malloc(sizeof (X));
X* p = new (raw) X(); // according to the standard, the RHS is a placement-new expression
::operator delete(p); // definitely wrong, per litb's answer
delete p; // legal? I hope not
おそらく、言語弁護士の1人が、標準がこれをどのように禁止しているかを説明できるでしょう.
配列形式もあります:
class X { /* ... */};
void* raw = malloc(sizeof (X));
X* p = new (raw) X[1]; // according to the standard, the RHS is a placement-new expression
::operator delete[](p); // definitely wrong, per litb's answer
delete [] p; // legal? I hope not
これは私が見つけることができた最も近い質問です。
編集:関数への引数を制限する標準の言語が、delete-expressionvoid ::operator delete(void*)
のオペランドに意味のある方法で適用されるという引数を購入していません。せいぜい、2 つの間の接続は非常に希薄であり、多くの式がに渡すのに有効でないオペランドとして許可されます。例えば:delete
delete
void ::operator delete(void*)
struct A
{
virtual ~A() {}
};
struct B1 : virtual A {};
struct B2 : virtual A {};
struct B3 : virtual A {};
struct D : virtual B1, virtual B2, virtual B3 {};
struct E : virtual B3, virtual D {};
int main( void )
{
B3* p = new E();
void* raw = malloc(sizeof (D));
B3* p2 = new (raw) D();
::operator delete(p); // definitely UB
delete p; // definitely legal
::operator delete(p2); // definitely UB
delete p2; // ???
return 0;
}
void operator delete(void*)
これが、ポインタを に渡すことができるかどうかが、同じポインタを のオペランドとして使用できるかどうかに関係がないことを示していることを願っていますdelete
。