我整天都在寻找这个。所以,在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
为了澄清,我的问题是如何在没有附加变量的情况下执行上述操作,并确保已创建的对象已被删除。
你可以从智能指针中寻求帮助。例如
printIt(std::make_unique<a>(1,3).get());
要么
printIt(std::unique_ptr<a>(new a{1,3}).get());
否则,您必须将指针保存在命名变量中,然后将delete
保存。
比...更好
a* b = new a {1, 3};
printit(b);
delete b;
你可以简单地做:
a b{1, 3};
printIt(&b);
将对象分配给指针变量,并将其传递给printit
。然后你可以删除它。
a *temp = new a {1, 3};
printit(temp);
delete temp;
如果给我printit()函数(意味着我无法访问printit()代码)并且printit()没有删除对象,有没有办法可以删除我创建的对象?
让printit()删除对象的唯一方法是修改printit()的实现。
如果你不允许修改printit()的实现,你总是可以创建自己的包装器函数并调用它:
void printitanddeleteit(a *aa)
{
printit(aa);
delete aa;
}
......作为一种风格说明:尽管将new
和delete
调用尽可能地保持在同一个函数中通常是一个好主意,因为如果你将它们分散在不同的函数中,你很快就会忘记谁应该是删除什么,何时,然后错误将蔓延,让你的生活悲惨。
另外我想要回顾一下songyuanyao推荐的内容:如果可能的话,在处理堆时使用智能指针,因为这样就不可能忘记调用delete
,或者在错误的时间调用它,因为你根本不需要调用它一点都没有。