我不是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;
堆栈中分配的对象的等价物是什么?
答案 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();
}
}