簡體   English   中英

在std :: vector :: reserve safe之后訪問原始指針?

[英]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類型。 當然,如果有人調用resizeinsertpush_back等,它會吹掉已經寫入內存的任何內容,並且向量的大小也會出錯。 沒有理由編寫這樣的代碼。

暫無
暫無

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

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