删除函数外部的实例化对象

Deleting instantiated objects outside of a function?

本文关键字:实例化 对象 外部 函数 删除      更新时间:2023-10-16

如何删除函数内的实例化对象,然后在调用另一个函数时删除?

例如:

int function_test(){
    object* a = new object();
}
int function_test2(){
    delete a;
}

调用 function_test2() 时需要删除对象 a。Function_test() 创建并设置对象 a 的值。

为了删除某些内容,您需要一个指向某些内容的指针。

当您在函数function_test中分配对象并希望在function_test2中删除它时,您需要注意一种方法,让function_test2掌握指向要删除的对象的指针。

有多种方法可以做到这一点,但最常见的方法是让function_test将指针返回给调用方,然后将该指针传递给function_test2

object* function_test() {
    object* a = new object();
    ...
    return a;
}
void function_test2(object* a) {
    ...
    delete a;
}

调用方需要"转移"指针,如下所示:

object obj = function_test();
...
function_test2(obj);

传输指针的其他方法包括使用文件静态指针、使用全局指针,以及当函数function_testfunction_test2是类的成员函数时使用实例变量。

不能在函数之间传输局部变量。如果你喜欢做这样的事情,我建议你返回指针,这样你就可以把它传递给下一个函数。

object *function_test()
{
auto *o = new object{};
return o;
}

但是,这样做的缺点是,您必须在调用此变量的任何位置捕获此变量,并且必须进行内存管理。很可能你只是想使用面向对象的东西,类似于:

class ObjectOwner final
{
public:
     int function_test(){
         a = new object();
     }
    int function_test2(){
         delete a;
     }
private:
   object *a{nullptr};
};

可用作:

 ObjectOwner owner;
 owner.function_test();
 owner.function_test2();

更好的方法是使用std::unique_ptr<object>,这样当您忘记调用第二个函数时,内存就会被释放。

最后,您可以考虑使用构造函数/析构函数。

class ObjectOwner final
{
public:
     ObjectOwner()
         : a(std::make_unique<object>())
     {
     }
    ~ObjectOwner() = default;
    void func() { /*Do something with a*/ }
private:
   std::unique_ptr<object> a{};
};

允许您编写:

ObjectOwner owner{};
owner.func();