在非常量向量内的常数向量中的地址是不是稳定?
Posted
技术标签:
【中文标题】在非常量向量内的常数向量中的地址是不是稳定?【英文标题】:Are addresses into constant vectors, inside a non-constant vector, stable?在非常量向量内的常数向量中的地址是否稳定? 【发布时间】:2021-09-22 16:21:42 【问题描述】:如果我有std::vector<std::vector<char>>
如果以下情况属实:
内部向量的大小永远不会改变 外部向量的大小随着插入和删除而改变可以这样把地址带入内层向量,修改外层向量后使用,安全吗?
std::vector<std::vector<char>> buffer;
#include <code that inserts into "buffer" uhhh 10 vectors with 100 char each>
char * ch = buffer[5].data();
// example of code that never erases/resizes the vector "ch" is pointing into...
// ... BUT will remove/insert vectors around it, prompting "buffer" to reallocate
buffer.erase(buffer.begin(), buffer.begin() + 4);
buffer.shrink_to_fit();
buffer.insert(buffer.begin(), std::vector<char>(1));
assert(buffer[1].data() == ch); // the 5th inner-vector moved to index 1
printf("how is this bit%c?", *ch); // but hopefully "ch" is still valid?
【问题讨论】:
从 C++11 开始,您应该是安全的,因为当调整“外部”向量的大小时,“内部”向量是移动的,而不是复制的。请注意,由于小的缓冲区优化,它不适用于 std::string。 【参考方案1】:如果外部向量必须增长,它将分配一个新缓冲区并将所有内部向量移动到该缓冲区中。这意味着那些内部向量的地址会改变,但这并不意味着内部向量的缓冲区地址会改变。它们将保持不变,因为向量需要在移动时不使向量中的任何迭代器/引用/指向元素的指针失效。
【讨论】:
以上是关于在非常量向量内的常数向量中的地址是不是稳定?的主要内容,如果未能解决你的问题,请参考以下文章
C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]