a)指向矢量元素的地址是否安全?
unsigned int* ptr;
std::vector<unsigned int> vec;
vec.resize(10);
vec[0] = 10;
ptr = &vec[0];
在我看来,只要我不改变预分配矢量的大小,&amp; vec [0]的地址就不会改变。我的问题是,只要它被预先分配就可以安全地指向一个向量元素。
b)如果我没有预先分配vec的大小,那么&amp; vec [0]的地址似乎会改变。如果我通过vec.push_back()将其他值推送到向量。 我想有一个指向矢量指针的矢量。
std::vector<unsigned int*> ptr_vec(10,0);
std::vector<unsigned int> index_vec;
index_vec.push_back(0);
ptr_vec[0] = &index_vector[0];
ptr_vec[1] = ptr_vec[0];
index_vec.push_back(1); // at this point the adress of &index_vec[0] changes. thats my problem
答案 0 :(得分:2)
看起来index_vec
向量之前没有重新调整大小,添加第二项&#39; 1&#39;导致STL分配更多内存,从而将原始缓冲区移动到其他位置。
尝试重新调整index_vec
向量的大小以保留缓冲区。
例如,使用index_vec.resize(10);
来保留10个位置的内存。
修改强> 以及你的问题 - &#34; safe&#34;取决于用法...它是可行的,但可能非常非常安全地指向STL向量内部缓冲区。
如果向量预分配,(使用resize
)项目&#39;地址得以维持。但是如果你向向量推送一个额外的项目,STL可能会改变内存位置(这是关于STL的好处......内存管理由库拥有,而不是我们;-))
答案 1 :(得分:1)
所以回答你的实际问题:
我的问题是,如果指向一个向量元素是安全的,只要它是预分配的
是的,确实如此。只要您预先分配其内容并且不以任何方式更改其大小。
Read the documentation of std::vector
获取使这种指针操作不安全的方法列表。 (搜索被称为的方法“使指针无效”。)
另外,请参阅this related question and answer,它是关于迭代器失效的,类似的概念。