如何重用在堆栈中创建的对象
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.
}
如果一个对象不允许通过公共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
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何创建对象函数指针C++映射?
- C++创建对象数组
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何获取在 main() 函数中构造的类的创建对象?
- 基于文件中的条目创建对象
- 错误:创建对象后无法分配区域
- C++ 通过输入创建对象
- 堆还是堆栈用于创建对象?
- 使用 C++ 创建对象数组
- 使用unique_ptr创建对象
- C++递归地在类构造函数中创建对象
- 通过向构造函数其他对象引用页面来创建对象
- ReactiveX (rx) - 在对象上应用可观察对象,而不是在可观察对象中创建对象
- 如何在OSX上正确创建C++对象文件(.o)
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- 创建对象并防止被破坏
- 在C++中,友元类可以从友元类创建对象吗
- 只在堆中创建C++对象
- 创建用户定义的复制构造函数时无法创建对象