[英]Is accessing the raw pointer after std::vector::reserve safe?
這是相當牽強的,但以下代碼是“安全的”(即保證不會導致分段錯誤):
std::vector<int> vec(1); // Ensures that &vec[0] is valid
vec.reserve(100);
memset(&vec[0], 0x123, sizeof(int)*100); // Safe?
我意識到這很難看 - 我只想知道它是否技術上安全,而不是“漂亮”。 我猜它唯一的用法可能是忽略存儲在給定索引之外的值。
注意! 如何獲取vector :: reserve()分配的緩沖區地址? 涵蓋相同的主題,但我更感興趣的是,如果這是安全的 ,如果有這樣的陷阱。
編輯:原始代碼錯誤,用memset
替換原始memcpy
。
不,這不安全。
在reserve()
,保證向量不會重新分配存儲,直到達到capacity()
。
但是,該標准沒有說明vector實現可以對size()
和capacity()
之間的存儲做什么。 也許它可以用於一些內部數據 - 誰知道? 也許地址空間只是保留而沒有映射到實際的RAM?
訪問[0..size]之外的元素是未定義的行為。 可能會有一些硬件檢查。
向量重新分配使現有指針,引用等無效。預留可以觸發重新分配(23.3.6.2,[vector.capacity]),但是在最終重新分配之后你將獲取第一個元素的地址(在這種情況下不會發生在所有,但除了這一點之外)。 所以我發現代碼沒有問題。
首先請注意,您的memset
會將0x123
截斷為單個字節並寫入,而不是寫入四字節模式。
然后,不要這樣做,只需使用容器: std::vector<int> vec(100, whatever_value_you_want);
但是,要回答這個問題,如果編譯器不為任何事情使用分配的空間,它可能看起來特別適用於POD類型。 當然,如果有人調用resize
, insert
, push_back
等,它會吹掉已經寫入內存的任何內容,並且向量的大小也會出錯。 沒有理由編寫這樣的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.