Wun*_*una 1 c++ memory-leaks dynamic
如果我在C++中有以下部分代码:
class X {
...
};
class Y {
public:
Y(X*) {...};
...
};
void main ()
{
X* px = new X;
new Y(px);
... // ***
}
Run Code Online (Sandbox Code Playgroud)
如何删除在main中创建的Y类对象?(*)只允许添加新的代码行而不是...,而不是更改现有代码.
免责声明永远不要写这样的代码; 尽可能避免使用动态对象,如果确实需要动态对象,请始终使用RAII以简单,安全的方式管理它们.
将第一个替换为...:
#define void int
Run Code Online (Sandbox Code Playgroud)
因为void main ()无效,我的编译器拒绝它.如果编译器功能不足,则可能不需要这样做.
将第二个替换为:
WTF() = this;
Run Code Online (Sandbox Code Playgroud)
隐藏指向需要在稍后定义的静态变量中删除的对象的指针.请注意,这只允许我们一次控制一个这样的对象; 但是,鉴于疯狂的要求,我想不出一个更好的方法来提供它.如果构造函数参数可用,那么我们可以将其存储在非静态成员中X; 但是这个论点是未命名的,所以我们不能对它做任何事情.
占据第三位:
static Y *& WTF() {static Y * y; return y;}
Run Code Online (Sandbox Code Playgroud)
给我们一个静态变量来存入指针.它不能是全局或静态类成员,因为它们必须在类定义之外定义.
现在我们可以将第四个替换为:
delete Y::WTF();
delete px;
Run Code Online (Sandbox Code Playgroud)
没有奇怪的要求,你可以用以下方法替换整个混乱:
int main() {
X x;
Y y(&x);
}
Run Code Online (Sandbox Code Playgroud)
所有这一切的教训是:如果以正确的方式执行,C++中的内存管理非常简单,如果以错误的方式执行,则会非常复杂.