1

我想使用 alist来保存一系列对象,这些对象包含有关我将执行的任务的信息。一旦这些对象之一完成,我就不再需要它;我只需要转到列表中的下一个对象。这基本上是一个队列。

关于指向这些对象的指针:

一旦我得到一个指向要操作的列表对象的指针,如果我删除列表中的其他元素,这个指针仍然有效,对吗?因为一旦我完成了我的第一个对象,我将移动到下一个对象,并且我将pop使用第一个对象,同时继续处理下一个对象,现在它成为第一个对象。本质上,我将始终处理列表中的第一个对象。我想确保即使我删除了其他列表项,指向现有列表项的指针也不会失效。

(顺便说一句,这是我想使用 a 的主要原因list,所以我可以操作它,而无需将所有其他列表对象潜在地移动到内存中的新空间,因为这种情况vector会使这变得昂贵)

关于内存:

当我向列表中添加某些内容时,我是否可以期望列表获得所有权,并且如果我的原始项目超出范围而列表仍处于成员变量范围内,我的对象仍将持续存在吗?然后,一旦弹出,item对象最终会超出范围吗?

4

2 回答 2

2

一旦我得到一个指向要操作的列表对象的指针,如果我删除列表中的其他元素,这个指针仍然有效,对吗?

是的,因为指向std::list不是指向普通双链表头元素的指针 -std::list类具有内部指针,它使它们远离用户(您可以使用迭代器迭代列表,但不能使用普通指针)。

当我向列表中添加某些内容时,我是否可以期望列表获得所有权,并且如果我的原始项目超出范围而列表仍然在成员变量范围内,我的对象仍然会存在吗?然后,一旦弹出,item对象最终会超出范围吗?

您需要创建 std::list<T>而不是std::list<T*>. 这样,当您将元素添加到列表中时,将调用复制构造函数,并将对象的副本放置在列表中,而不是实际的对象。

于 2013-04-26T10:34:45.030 回答
0

如果我删除列表中的其他元素,这个指针仍然有效,对吧?

是的,除非您从列表中显式删除元素或清除列表,否则列表元素的迭代器仍然有效。

当我向列表中添加某些内容时,我是否可以期望列表获得所有权,并且如果我的原始项目超出范围而列表仍然在成员变量范围内,我的对象仍然会存在吗?

是的,有点。该列表复制您推入其中的元素。它并没有真正获得所有权,而是创建了一个它拥有的新对象。

然后,一旦弹出,item对象最终会超出范围吗?

是的,该对象将不复存在。

请注意,如果您将指针传递给对象,则所有赌注都将关闭。在这种情况下,列表只控制它持有的指针的生命周期,而不是它们指向的对象。

于 2013-04-26T10:36:27.697 回答