【发布时间】:2018-03-19 16:51:25
【问题描述】:
如果我有一个对象向量,例如:
std::vector<Foo> foos;
for(int i = 0; i < 10; i++) {
foos.push_back(Foo());
}
假设我用不同的Bars 来区分它们,每个都有一个Foos 的向量:
std::vector<Bar> bars;
bars.push_back(Bar());
bars.push_back(Bar());
for(int i = 0; i < 5; i++)
bars.at(0).addFoo(foos.at(i));
for(int i = 5; i < 10; i++)
bars.at(1).addFoo(foos.at(i));
如果我现在这样做,例如foos.at(0).setValue(1),bars.at(0).getFoo(0).getValue() 不会是 1,所以我必须创建指针:
std::vector<Bar> bars;
bars.push_back(Bar());
bars.push_back(Bar());
for(int i = 0; i < 5; i++)
bars.at(0).addFoo(&foos.at(i));
for(int i = 5; i < 10; i++)
bars.at(1).addFoo(&foos.at(i));
bars.at(0).getFoo(0).getValue() 现在将返回 1。
但是如何正确清理这些指针呢?
- 如果我这样做
foos.pop_back(),我怎样才能自动删除bars.at(1)中的最后一个Foo 指针?因为在我的程序中,我有时不知道bars向量中指向确切对象的指针在哪里。 - 如果我这样做
bars.at(1).removeLastFoo(),对象当然会(也应该)在foos中保持活力。removeLastFoo()会删除Foos 的Bars 向量的最后一个指针并弹出它吗? - 如果我执行
bars.pop_back,我是否必须在Bars 析构函数中写入以删除其中的每一个指针?
如果我忘记了什么,请告诉我。
或者有没有更优雅的方式(我实际上不喜欢使用指针,但我看不到其他方式)能够在不同的位置看到相同的变化?
【问题讨论】:
-
你没有,这些指针不稳定。您可以考虑改用
std::list。 -
@user0042 是什么原因?我会在哪里使用它?而不是
Foos 的vector,Bars 的vector或Foos 内部的vectorBar类? -
它们不稳定,因为(连续数组的)内存管理受
std::vector的控制。
标签: c++ pointers object vector memory-management