【发布时间】:2020-04-12 09:57:32
【问题描述】:
我无法说服自己存储指向 vector.end() 的指针是安全的 (即任何向量 end() 迭代器返回)
数据是
std::vector<unsigned char> data;
auto end = &(*data.end());
block b(end, size);
blocks.push_back(b);
data.insert(data.end(), (unsigned char*) ptr_data, (unsigned char*) ptr_data + size);
我的问题是。这个地址是否可以改变( &*(data.end() ),条件是向量容量预先分配并且客户端永远不会插入超过向量应该存储的内容。
所以它应该是内存中的一个连续区域,所以我假设vector不会做任何memove操作,因此我可以存储指向不同元素的指针。 (所以这里块存储指向任何 data.end() 指向的指针(在插入数据向量之前) 以及关于该数据向量内可变大小数据的元数据。
谢谢。
【问题讨论】:
-
auto end = &(*data.end())-- 取消引用end迭代器是未定义的行为。例如,此代码在 Visual Studio 下运行时会导致assert()触发。 See this -
只需存储偏移量而不是指针或迭代器,您就不必担心它
-
用
auto end = &(*data.end());代替auto end = data.data() + data.size(); -
这是一个问题:(我想这完全取决于向量如何预分配容量。如果内存由分配器以给定容量预分配,它不应该指向外部的东西)跨度>
-
@Kevin 你说得对,它可能是一个更好的解决方案。但我不太确定固定容量向量的失效。 Vector 有自己的内存管理,所以我不确定它保证什么。