删除未引用的动态内存

时间:2012-09-11 14:04:52

标签: c++ dynamic memory-leaks

如果我在C ++中有以下部分代码:

class X {
   ...
};

class Y {
public:
  Y(X*) {...};
  ...
};

void main () 
{
  X* px = new X;
  new Y(px);
  ... // ***
}

如何删除在main中创建的Y类对象? ( * 的) 它只允许添加新的代码行而不是...,而不是更改现有代码。

2 个答案:

答案 0 :(得分:7)

免责声明永远不要写这样的代码;尽可能避免使用动态对象,如果确实需要动态对象,请始终使用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 ++中的内存管理非常简单,如果以错误的方式执行,则会非常复杂。

答案 1 :(得分:2)

我完全同意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;
}