如何正确使用指针向量?

时间:2017-10-08 10:42:10

标签: c++ pointers object vector memory-management

如果我有一个对象矢量,例如:

std::vector<Foo> foos;

for(int i = 0; i < 10; i++) {
    foos.push_back(Foo());
}

并且我可以说我在不同类型的Bar s中区分它们,每个Foo都有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)); s的向量:

foos.at(0).setValue(1)

如果我现在做bars.at(0).getFoo(0).getValue()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)); 不会是1,所以我必须创建指针:

bars.at(0).getFoo(0).getValue()

foos.pop_back()现在将返回1.

但是如何正确清理这些指针呢?

  • 如果我bars.at(1),我怎样才能自动将bars中的最后一个Foo指针删除?因为在我的程序中,我有时不知道bars.at(1).removeLastFoo()向量中指向精确对象的指针在哪里。
  • 如果我foos,那么该对象将在removeLastFoo()中保持活力(并且也应该)。 Bar只会删除Foo s的bars.pop_back向量的最后一个指针并弹出它吗?
  • 如果我Bar,我是否必须在--author="BtheDestroyer"的析构函数中写入以删除每个指针?

如果我忘记了什么,请告诉我。

或者是否有一种更优雅的方式(我实际上不喜欢使用指针,但我没有别的方法)能够在不同的位置看到相同的变化?

2 个答案:

答案 0 :(得分:0)

最后,我通过不向bars添加任何对象或指针来修复我的问题。我修改了Bar类,而不是添加Foo对象或指针,而是从原始foos向量中添加了索引。

// create foos
std::vector<Foo> foos;

for(int i = 0; i < 10; i++) {
    foos.push_back(Foo());
}


// create bars
std::vector<Bar> bars;

bars.push_back(Bar());
bars.push_back(Bar());

for(int i = 0; i < 5; i++)
    bars.at(0).addFooIndex(i);

for(int i = 5; i < 10; i++)
    bars.at(1).addFooIndex(i);


// print & calculate
foos.at(0).setValue(1);
std::cout << foos.at(bars.at(0).getFirstIndex()).getValue() << std::endl; // prints 1

foos.at(bars.at(0).getFirstIndex()).setValue(2);
std::cout << foos.at(0).getValue() << std::endl; // prints 2

答案 1 :(得分:0)

如果您使用的是C ++ 11,则可以使用shared_ptrweak_ptr的组合:

std::vector<std::shared_ptr<Foo>> foos;

在Bar内部你会有一个weak_ptr的向量:

std::vector<std::weak_ptr<Foo>> foos_inside_bar;


for(int i = 0; i < 5; ++i) {
    std::weak_ptr<Foo> weak_foo_ptr = foos.at(i);
    bars.at(0).addFoo(weak_foo_ptr);
}

如果您执行foos.pop_back()shared_ptr中的foos会被删除,而最后weak_ptr条会expireweak_ptr 如果您移除bars中的shared_ptr,则foos中的gradlew test会保持活跃状态​​。