有没有办法删除传递给函数foo(new Object())的对象?

时间:2018-06-23 02:44:33

标签: c++ oop pointers memory-management

我整天都在寻找。因此,在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

为澄清起见,我的问题是我如何在没有附加变量的情况下执行上述操作,并确保已删除创建的对象。

4 个答案:

答案 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;
}

...作为样式说明:不过,通常最好将newdelete调用尽可能地保持在同一函数中,因为如果将它们分散不同的功能,您很快就会忘记谁应该删除什么内容,何时删除,然后错误会蔓延,使您的生活痛苦不堪。

我还想说一下第二个建议:如果有可能,在处理堆时使用智能指针,因为那样就不可能忘记调用delete或在错误的时间调用它,因为您根本不需要调用它。