如果我在 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 ()
是无效的,我的编译器拒绝它。如果您的编译器功能失调,这可能不是必需的。
将第二个替换为:
WTF() = this;
将指向需要删除的对象的指针存储在稍后定义的静态变量中。请注意,这只允许我们一次控制一个这样的对象;但是,考虑到疯狂的要求,我想不出更好的方法来提供它。如果构造函数参数可用,那么我们可以将它存储在一个非静态成员中X
;但是这个参数是未命名的,所以我们不能用它做任何事情。
将第三个替换为:
static Y *& WTF() {static Y * y; return y;}
给我们一个静态变量来存储指针。它不能是全局或静态类成员,因为它们必须在类定义之外定义。
现在我们可以将第四个替换为:
delete Y::WTF();
delete px;
如果没有奇怪的要求,您可以将整个混乱替换为:
int main() {
X x;
Y y(&x);
}
所有这一切的教训是:如果你以正确的方式进行,C++ 中的内存管理非常简单,如果你以错误的方式进行,则非常复杂。
我完全同意 Mike 的回答,但我想举一个工作代码的例子,而不是 Luchian 的
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;
}