我整天都在寻找。因此,在C++
中,如果您具有以下代码:
#include <iostream>
struct a {
int x, y;
a (int aa = 0, int bb = 0) : x{aa}, y{bb} {
}
};
void printit (a*);
int main (void) {
printit (new a {1,3});
return 0;
}
void printit (a *aa) {
std::cout << aa->x << " - " << aa->y;
}
如果我获得了printit ()
函数(意味着我无法访问printit()
代码)并且printit()
没有删除对象,那么有没有办法我可以删除对象创建了吗?
printit (new a {1,3}); // <--- this object
为澄清起见,我的问题是我如何在没有附加变量的情况下执行上述操作,并确保已删除创建的对象。
答案 0 :(得分:7)
您可以向智能指针寻求帮助。例如
printIt(std::make_unique<a>(1,3).get());
或
printIt(std::unique_ptr<a>(new a{1,3}).get());
否则,您必须将指针保存在一个命名变量中,然后delete
将其保存。
答案 1 :(得分:3)
优于
a* b = new a {1, 3};
printit(b);
delete b;
您可以简单地做到:
a b{1, 3};
printIt(&b);
答案 2 :(得分:1)
将对象分配给指针变量,然后将其传递给printit
。然后您可以将其删除。
a *temp = new a {1, 3};
printit(temp);
delete temp;
答案 3 :(得分:1)
如果我获得了printit()函数(意味着我无权访问 printit()代码)和printit()不会删除对象,是否存在 删除已创建对象的方法?
获取printit()删除对象的唯一方法是修改printit()的实现。
如果不允许您修改printit()的实现,则始终可以创建自己的包装函数,并调用该函数:
void printitanddeleteit(a *aa)
{
printit(aa);
delete aa;
}
...作为样式说明:不过,通常最好将new
和delete
调用尽可能地保持在同一函数中,因为如果将它们分散不同的功能,您很快就会忘记谁应该删除什么内容,何时删除,然后错误会蔓延,使您的生活痛苦不堪。
我还想说一下第二个建议:如果有可能,在处理堆时使用智能指针,因为那样就不可能忘记调用delete
或在错误的时间调用它,因为您根本不需要调用它。