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

时间:2014-05-15 16:29:51

标签: c++ object constructor stack

我不是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;

堆栈中分配的对象的等价物是什么?

3 个答案:

答案 0 :(得分:8)

释放自动变量的唯一方法是让它们超出范围:

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.
}

答案 1 :(得分:2)

只是想为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

答案 2 :(得分:1)

如果一个对象不允许通过公共设置者重新初始化 - 你不能这样做。

实际上,在您的示例中,您不是要重新初始化 object ,而是创建另一个Foo实例,并使用此对象的地址重新初始化指针变量。 / p>

局部变量的生命周期限于其范围。因此,您可以将函数的范围拆分为较小的范围:

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