内存管理-删除保留指向同一向量上一个元素指针的对象向量 < >新到C++。< /P>

内存管理-删除保留指向同一向量上一个元素指针的对象向量 < >新到C++。< /P>,c++,pointers,memory-management,C++,Pointers,Memory Management,假设我有一个std::vector foos,Foobeing //在我的例子中,这是一个虚拟类。 福班{ 私人: Foo*m_previous_Foo{nullptr}; 公众: //这个类应该有一个析构函数来销毁它的m_-previous_-foo吗? //在海事组织看来,这似乎是不正确的,因为 //我猜,酒吧里的Foo会删除我仍然想保留的Foo吗? //由Bar的构造函数调用,这是我的用例所必需的。 void set_previous(Foo*previous_Foo){m_previou

假设我有一个
std::vector foos
Foo
being

//在我的例子中,这是一个虚拟类。
福班{
私人:
Foo*m_previous_Foo{nullptr};
公众:
//这个类应该有一个析构函数来销毁它的m_-previous_-foo吗?
//在海事组织看来,这似乎是不正确的,因为
//我猜,酒吧里的Foo会删除我仍然想保留的Foo吗?
//由Bar的构造函数调用,这是我的用例所必需的。
void set_previous(Foo*previous_Foo){m_previous_Foo=previous_Foo;};
const bool previous_is_valid()const{return m_previous_foo!=nullptr;};
};
以及拥有该向量的

类栏{
私人:
std::向量m_foos;
公众:
~Bar(){
//我在这里干什么?
//我的想法1:
用于(自动p_foo:m_foos){
如果(p_foo->previous_是有效的()){
删除p_foo->get_previous();
}否则{//上一个指针已为nullptr,仅删除指针
删除普富;
}
}
//我的想法2:
用于(自动p_foo:m_foos){
删除普富;
}
//我的想法3:基本上与想法1相同,但检查索引0
//作为删除指针的唯一情况。
}
}
编辑:此向量在4个元素中的外观示例:

vector[0]=Foo和m_previous_Foo=nullptr
向量[1]=Foo和m_previous_Foo=&vector[0];
向量[2]=Foo和m_previous_Foo=&vector[1];
向量[3]=Foo与m_previous_Foo=&vector[2];
我的猜测是,所有这些都是不正确的,因为无论我如何删除这些指针,它们都会在“下一个”Foo中失效,即拥有现在已删除指针的Foo


编辑:我还在训练轮子,我读过关于智能指针的书,但是,我不理解它们,我认为我应该在使用智能抽象之前理解指针管理。

首先,
delete
不会将指针设置为
nullptr
。其次,将空指针传递到
delete
是可以的(它只是不做任何事情)。第三,“先前的foo”也会出现在向量中吗?你的问题的解决取决于这个。啊,好吧,我不知道在nullptr上删除什么都不做。我将用以前的foo信息更新问题。为什么在每个
foo
中都需要指向以前的
foo
的指针?为什么不仅要有一个
std::vector
(或者
std::list
,如果你不需要重新定位实际的
Foo
s)并使用迭代器在容器中来回移动?@tedlynmo我可能能够重新设计算法,但基本上,需要Foo*的前一个实现的输出来计算所有者的输出。由于所有“前一个Foo”也将在向量中,所以备选方案2似乎是最简单的解决方案。