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

Posted

技术标签:

【中文标题】有没有办法删除传递给函数 `foo (new Object())` 的对象?【英文标题】:Is there a way to delete an object passed to a function `foo (new Object())`? 【发布时间】:2018-06-23 02:44:32 【问题描述】:

我整天都在寻找这个。所以,在C++,如果你有这个代码:

#include <iostream>                                                                                                       

struct a 
    int x, y;
    a (int aa = 0, int bb = 0) : xaa, ybb 
    
;

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

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

【问题讨论】:

【参考方案1】:

您可以向智能指针寻求帮助。例如

printIt(std::make_unique<a>(1,3).get());

printIt(std::unique_ptr<a>(new a1,3).get());

否则,您必须将指针保存在命名变量中,稍后再使用delete

【讨论】:

请问这两者有区别吗? @Gox 此处效果相同。我们应该更喜欢第一个。 @Gox 欲了解更多信息,请参阅here。 非常感谢您的回答。我接受了你的回答,因为它最接近我正在寻找的内容,但我确实使用了 jeremy 的 friesner 回答中的包装函数。【参考方案2】:

优于

a* b = new a 1, 3;
printit(b);
delete b;

你可以这样做:

a b1, 3;
printIt(&b);

【讨论】:

【参考方案3】:

如果给我 printit() 函数(意味着我无权访问 printit() 代码)和 printit() 不删除对象,是否有 如何删除我创建的对象?

让 printit() 删除对象的唯一方法是修改 printit() 的实现。

如果您不允许修改 printit() 的实现,您可以随时创建自己的包装函数并调用它:

void printitanddeleteit(a *aa)

   printit(aa);
   delete aa;

...不过,作为一种风格说明:通常最好将newdelete 调用尽可能地放在同一个函数中,因为如果将它们分布在不同的函数中,您将很快就会忘记谁应该删除什么,什么时候删除,然后错误就会蔓延,让你的生活变得悲惨。

我还想支持宋元瑶的建议:如果可能的话,在处理堆时使用智能指针,因为这样就不可能忘记调用delete,或者在错误的时间调用它,因为你根本不需要调用它。

【讨论】:

大声笑,我最终使用了您的解决方案,只是因为需要尽量减少 std 库的使用。谢谢!!!【参考方案4】:

将对象分配给一个指针变量,并将其传递给printit。然后你可以删除它。

a *temp = new a 1, 3;
printit(temp);
delete temp;

【讨论】:

以上是关于有没有办法删除传递给函数 `foo (new Object())` 的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如果没有实际传递给函数,如何重新声明函数参数?

ruby **option作为函数参数,map的key必须是符号

有没有办法获取传递给函数的数组的大小?

有没有办法将时间权重传递给损失函数?

sklearn 管道有没有办法在网格搜索期间进行有步骤和无步骤的训练?我可以删除步骤,但如何将其传递给 GridSearchCV?

AccessViolationException将数组传递给本机函数