std::list是否指向相同的内存?
Does a std::list point to the same memory?
我想知道std::list
是否指向相同的内存,如std::vector
,如果一个元素是,例如,push_back
ed,它只是使用new
分配,它指向其他元素(与next
和prev
)?
template<class T>
struct node
{
node<T> *next, *prev;
T value;
};
标准只保证vector
返回指向第一个元素地址的连续内存块的指针,而list
则不是这样
首先,std::vector
不会在push_back
之后指向相同的内存,至少不是一直指向相同的内存:如果分配的大小不足,std::vector
将重新分配其内部数据块,因此它将指向内存中的不同位置。
与std::vector
不同,std::list
是一个链表,因此它的头将放在push_back
之后的内存中相同的位置。但是,std::list
不支持对其元素的快速随机访问。
标准没有精确说明容器是如何实现的(list
, deque
, vector
,…),但是要求是如此严格,通常可以推断出来。
例如,大小为N
的std::vector
必须保证[0, N)
中的&vec[0] + i = &vec[i]
对应i
(这是一种花哨的措辞,意味着它具有连续存储)。
std::list
必须保证:
- 插入/移除
O(1)
- 的插入/删除不会影响列表中任何其他元素:指向它们的迭代器不会失效,并且它们的地址是稳定的
这种稳定性意味着一个基于节点的容器,因此规范实现是一个双链表。
我也不知道。两个容器都拥有自己的元素,因此将元素插入到容器中需要创建一个新元素。必须是这样。原因:
{
SomeContainer <T> container;
{
T element;
container.push_back(element);
}
// Here
此时,element
不在作用域中,不再存在,但是容器仍然在作用域中。所以容器必须已经创建了自己的T
与不同的作用域
相关文章:
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 内存未释放 std::list<std::shared_ptr<std::string>> C++
- 存储 std::list 元素的地址;内存
- thread_local std::list 是否会在呼叫清除时放弃分配的内存
- 将 SharedPtr 与 std::list 一起使用时内存泄漏!错误
- 带有std :: list和std :: shared_ptr的内存管理
- (C++) list.error 方法和使用指针删除内存
- 'Corrupted double-linked list'内存错误 - OpenCV-Python 3.0.0 和 ARM 上的 Numpy
- 动态分配内存以接收FTP服务器的LIST响应时的SIGSEGV
- 使用 std::list 时内存泄漏
- 结构中的 std::list 导致内存冲突错误
- 为什么<list>元素会在使用 malloc() 内存的对象中导致分割错误
- std::string::clear和std::list::clear是否从内存中擦除数据
- C++ - std::list remove_if 不会释放内存?
- std::list会改变元素在内存中的位置吗?
- std::list是否保证项永远不会被移动到不同的内存位置?
- 将 'ui.listView->setModel(new QStringListModel(list));' 导致内存泄漏
- std::list中的Push_back似乎会导致内存泄漏
- 使用std容器(如vector、list、queue等)的稳定内存地址
- std::list的pop_back()是否取消内存分配?