簡體   English   中英

從std :: vector :: operator []獲取返回地址的作用是什么?

[英]What does taking address of return from std::vector::operator[] do?

我做的事情如下:

struct ABC{
int p,q,r;
};

struct X{
ABC *abc;
X(ABC &abc) : abc(&abc) {}
};

std::vector<ABC> vec;
... //populate vec

X x(vec[2]);

當我調試時, x.abc在分配后看起來是正確的,但是不久之后x.abc中的數據就是垃圾。 這讓我覺得指針是指向局部變量的,但是vector::operator[]返回一個引用,這樣可能嗎?

在內部, std::vector通常維護其包含的元素的動態數組。 如果向量的大小變得太大並超過其舊容量,則它將分配一個新數組,將舊元素復制過來,然后取消分配舊數組。 結果,對該舊數組的任何引用或指針都將變為無效,並且如果使用,將導致未定義的行為。

如果要將指針存儲到向量中,則應確保向量不會最終重新分配其內部緩沖區。 您可以通過等待直到將所有要添加到矢量的元素添加到矢量之前再進行引用,或者通過調用vector::reserve以確保容量足夠大來做到這一點。

不過,更好的做法是將對vector對象本身的引用與索引一起存儲,然后每次在該索引處查找元素。 這樣,如果向量調整其內部緩沖區的大小,則指針不會成為垃圾,因為您每次都在向量中重新索引。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM