簡體   English   中英

存儲指向固定大小向量內的元素的指針

[英]store a pointers to element that inside a fixed size vector

我無法說服自己存儲指向 vector.end() 的指針是安全的(即無論 vector 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() 指向(在插入數據向量之前)和有關該數據向量中可變大小數據的元數據。

謝謝你。

存儲諸如std::vector::end()類的迭代器應該是安全的,只要它不會失效 有一長串關於失效的規則,但它的要點(因為它與你的例子有關)是這樣做是可以的,直到你點擊push_back()

blocks.push_back(b);

此調用使迭代器無效,因為它會調整其大小。 您將需要再次獲取blocks.end()才能使其有效。


需要注意的一件事是,您可能不應該取消引用end() 這是不安全的 但是,您的用例與常規數組的這個問題非常相似。 這解決了常規數組,而不是向量,但我想它會非常相似。

長話短說,如果你取數組元素最后一個的地址,它可能會或可能被認為是未定義的行為,並且被一些人認為是標准中的缺陷。

相反,您實際上並不需要存儲解引用迭代器的地址,只需存儲迭代器:

auto end = data.end();

迭代器被設計為與指針類似的工作方式,所以沒有真正的理由在這里獲取一個地址。

暫無
暫無

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

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