存储对象列表

mpe*_*pen 5 c++ pointers

假设我有一个通用的Object类和一个通用的List类.我想维护这些对象的列表.我应该将它们存储为List<Object>List<Object*>

如果我使用List<Object>,我有一个方法,如:

if(some_condition) {
    Object obj;
    myObjectList.append(obj);
}
Run Code Online (Sandbox Code Playgroud)

而我的列表类只保留对该对象的引用,因此只要if语句终止,对象就会被销毁,并且我推送的对象变得无效.那么我最终做了类似的事情:

Object *obj = new Object;
myObjectList.append(*obj);
Run Code Online (Sandbox Code Playgroud)

这样它就不会被破坏.但现在这些物体是不可取的,不是吗?因为现在它们被安全地存储在List作为对象,而不是指向对象的指针,所以我不能在它们上调用delete ...或者当它们从列表中弹出时它们会自动被销毁吗?

在那种情况下,List<Object*>当我完成它们时,我应该使用并从列表中删除它们,不是吗?

如此困惑......我确信我在某处有一个根本的误解.

Eva*_*ran 5

编辑: 正如评论中提到的那样,boost :: ptr_list甚至更好,因为它效率更高,并且具有与a相同的净效果std::list<boost::shared_ptr<T> >.


编辑: 你提到你在评论中使用Qt.如果你使用> = 4.5,你可以使用Qt QListQSharedPointer类这样的类:

QList<QSharedPointer<Object> > object_list;
object_list.push_back(QSharedPointer<Object>(new Object));
Run Code Online (Sandbox Code Playgroud)

我建议你使用std::list<>.您可能只想存储指向对象的指针,这样它们就不会一直被复制.

所以底线是:

假设你有一个名为的类Object.你应该做这个:

std::list<boost::shared_ptr<Object> > object_list;
object_list.push_back(new Object);
Run Code Online (Sandbox Code Playgroud)

对于c ++ 11/14,不需要boost,只需使用标准的智能指针:

std::list<std::shared_ptr<Object>> object_list;
object_list.push_back(std::make_shared<Object>());
Run Code Online (Sandbox Code Playgroud)

通过使用共享指针,当从列表中删除对象时,对象将自动清除(如果没有其他shared_ptrS也指向它).

你可以有一个list<Object *>.但考虑到你的经验水平,我觉得引用计数指针会更容易让你使用.

在那种情况下,我应该使用List并在我完成它们时从列表中删除它们,不是吗?

是的,这是一个可行的选择,但我强烈推荐智能指针,以避免"...并从列表中删除它们......"完全步骤.


注意:

你给出的示例代码:

Object *obj = new Object;
myObjectList.append(*obj);
Run Code Online (Sandbox Code Playgroud)

可能不是你想要的,这会在堆上创建一个新对象,它们会在列表中放置一个副本.如果delete obj之后没有,则因为原始指针不是自动deleted而导致内存泄漏.