如何重用在堆栈中创建的对象

How to reuse object created in the stack

本文关键字:创建 对象 堆栈 何重用      更新时间:2023-10-16

我不是一个c++程序员,我非常尊重它的复杂性,所以我通常会远离它。尽管如此,我还是找到了一个我想要修改的库。

库包含一个示例代码片段,其中在局部范围内分配单个实例:

    Foo foo(arg1, arg2, ...);

我想修改这个例子来重新初始化对象,用它做更多的事情,但我不能通过getter/setter或公共变量来做。这在不创建更多实例的情况下是否可行?

在没有创建新实例的情况下没有办法这样做,我怎么能释放我不再需要的对象的内存?

例如,如果它是一个动态对象,我猜它应该是这样的:

    Foo* pfoo;
    pfoo = new Foo(arg1, arg2, ...);
    pfoo->doSomething();
    delete pfoo;
    pfoo = new Foo(arg3, arg4, ...);
    pfoo->doSomething();
    delete pfoo;

在堆栈中分配的对象的等效值是什么?

释放自动变量的唯一方法是让它们脱离作用域:

void bar() {
  Foo f1(arg1, arg2);
  f1.doSomething();
  {
    Foo f2(arg3, arg4);
    f2.doSomething();
    // other stuff ...
    // f2 dies here.
  }
  {
    Foo f3(arg5, arg6); // allocated on stack, possibly overlapping f2's old spot
    f3.doSomething();
    // ...
    // f3 dies here.
  }
  // f1 dies here.
}

如果一个对象不允许通过公共setter重新初始化它自己-你不能这样做。

实际上,在您的示例中,您没有重新初始化对象,您创建了Foo的另一个实例并重新初始化指针变量与该对象的地址。

局部变量的生存期受其作用域的限制。因此,您可以将函数的作用域拆分为更小的作用域:

void bar()
{
  {
    Foo foo(arg1, arg2, ...);
    foo.doSomething();
  }
  {
    Foo foo(arg3, arg4, ...);
    foo.doSomething();
  }
}

只是想再发布一个OP的替代方案,更符合他的建议:

void somefunction()
{
    // create the first foo owned by a smart pointer
    std::unique_ptr<Foo> pFoo { new Foo { arg1, arg2, ... } };
    pFoo->doSomething();
    // now replace the old Foo with a new one
    pFoo.reset( new Foo { arg3, arg3, ... } );
    pFoo->doSomething();
    // no need to delete anything unless you specifically want the Foo to die now
    // in which case...
    // pFoo.reset();
} // implicit destruction of whatever pFoo owns happens here