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

问题描述 投票:0回答:4

我整天都在寻找这个。所以,在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

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

c++ oop pointers memory-management
4个回答
7
投票

你可以从智能指针中寻求帮助。例如

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

要么

printIt(std::unique_ptr<a>(new a{1,3}).get());

否则,您必须将指针保存在命名变量中,然后将delete保存。


3
投票

比...更好

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

你可以简单地做:

a b{1, 3};
printIt(&b);

1
投票

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

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

1
投票

如果给我printit()函数(意味着我无法访问printit()代码)并且printit()没有删除对象,有没有办法可以删除我创建的对象?

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

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

void printitanddeleteit(a *aa)
{
   printit(aa);
   delete aa;
}

......作为一种风格说明:尽管将newdelete调用尽可能地保持在同一个函数中通常是一个好主意,因为如果你将它们分散在不同的函数中,你很快就会忘记谁应该是删除什么,何时,然后错误将蔓延,让你的生活悲惨。

另外我想要回顾一下songyuanyao推荐的内容:如果可能的话,在处理堆时使用智能指针,因为这样就不可能忘记调用delete,或者在错误的时间调用它,因为你根本不需要调用它一点都没有。

© www.soinside.com 2019 - 2024. All rights reserved.