繁体   English   中英

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

[英]How to reuse object created in the 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;

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

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

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

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

实际上,在您的示例中,您不是要重新初始化对象 ,而是创建另一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM