C ++のコードの次の部分がある場合:
class X {
...
};
class Y {
public:
Y(X*) {...};
...
};
void main ()
{
X* px = new X;
new Y(px);
... // ***
}
mainで作成されたクラスYのオブジェクトを削除するにはどうすればよいですか?(*)既存のコードを変更するのではなく、...の代わりに新しいコード行を追加することのみが許可されています。
C ++のコードの次の部分がある場合:
class X {
...
};
class Y {
public:
Y(X*) {...};
...
};
void main ()
{
X* px = new X;
new Y(px);
... // ***
}
mainで作成されたクラスYのオブジェクトを削除するにはどうすればよいですか?(*)既存のコードを変更するのではなく、...の代わりに新しいコード行を追加することのみが許可されています。
免責事項このようなコードは絶対に書かないでください。可能な場合は動的オブジェクトを避けてください。本当に必要な場合は、常にRAIIを使用して、単純で例外セーフな方法でそれらを管理してください。
最初のものを次のように置き換えます...
。
#define void int
無効であるためvoid main ()
、コンパイラはそれを拒否します。コンパイラが十分に機能していない場合、これは必要ないかもしれません。
2 番目を次のように置き換えます。
WTF() = this;
後で定義する静的変数で削除する必要があるオブジェクトへのポインターを隠します。これにより、一度に 1 つのオブジェクトしか制御できないことに注意してください。しかし、非常識な要件を考えると、それを利用できるようにするためのより良い方法は考えられません。X
コンストラクター引数が利用可能な場合、代わりに非静的メンバーにそれをスタッシュできます。しかし、引数には名前がないため、何もできません。
3 番目を次のように置き換えます。
static Y *& WTF() {static Y * y; return y;}
ポインターを格納するための静的変数を提供します。クラス定義の外で定義する必要があるため、グローバルまたは静的クラスメンバーにすることはできません。
これで、4 番目を次のように置き換えることができます。
delete Y::WTF();
delete px;
奇妙な要件がなければ、混乱全体を次のものに置き換えることができます。
int main() {
X x;
Y y(&x);
}
これらすべてから得られる教訓は、C++ でのメモリ管理は、正しい方法で行うと非常に簡単ですが、間違った方法で行うと非常に複雑になるということです。
私はマイクの答えに完全に同意しますが、ルシアンのコードとは対照的に、実際のコードの例を挙げたいと思います
class X {
public: void*data;
};
class Y {
public:
Y(X*px)
{ px->data = this; };
};
int main ()
{
X* px = new X;
new Y(px);
delete static_cast<Y*>(px->data);
return 0;
}