gpt4 book ai didi

c++ - 删除未引用的动态内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:41 25 4
gpt4 key购买 nike

如果我在 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++ 中的内存管理非常简单,如果您以错误的方式进行,则会极其复杂。

关于c++ - 删除未引用的动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com