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

时间:2016-03-20 11:00:54

标签: c++

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

例如:

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

int function_test2(){
    delete a;
}

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

2 个答案:

答案 0 :(得分:0)

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

当您在函数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_test

传递指针的其他方法是使用文件静态指针,使用全局指针,并在函数function_test2OnConnected是类的成员函数时使用实例变量。

答案 1 :(得分:0)

您无法在函数之间传输局部变量。如果您喜欢这样做,我建议您返回指针,以便将其传递给下一个函数。

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();