為何std vector push back不檢查引數的位址是否在自己容器範圍內?

時間 2021-05-31 06:11:41

1樓:

實際上vector能取得自身元素的引用,就已經破壞完整性了。

如果vector不能獲取自身元素的引用,

而是用屬性[1], 類似D語言的做法,那麼這個問題就簡單了value_type operator(index_type);

void operator(int index, T);

另一種辦法是禁止reserve函式,一次就分配足夠大的記憶體。 過大的記憶體,用虛擬頁表,而不是malloc。 64位系統,虛擬記憶體幾乎是無限制的。

[1] vc和clang支援屬性

2樓:

先問是不是,再問為什麼。

Is it safe to push_back an element from the same vector?

A commonly unknown std::vector pitfall r/cpp

3樓:暮無井見鈴

我懷疑 push_back/emplace_back 複製插入容器內元素是安全的。

(不過可能沒有嚴格保證,如有的 LWG 所說這裡規定比較含糊)不發生重分配的情況下自然沒事。

發生重分配時,一般實現做的是:

1) 分配新記憶體

2) 在新的結尾位置構造新元素

(異常處理:釋放新記憶體)

3) 把舊元素移動/複製過去

(異常處理:析構已構造元素,釋放新記憶體)

4) 析構舊元素,釋放舊記憶體

5) 調整 vector 物件內指標

新元素在步驟 2) 就構造好了,而此時所有舊元素都在舊位置上。

出問題的是 insert/emplace 插入到非容器尾,且不重新分配。此情況下,構造新元素前已經有元素挪位了。

而且此情況下異常處理也稍微有些麻煩,以致 libstdc++ 在很多個版本裡有遺漏。

4樓:d41d8c

該公升級toolset了。

長一點的回答:先問是不是,再問為什麼。標準說push_back必須有某某行為,並且沒有把引數依賴容器內現有元素的情況作為特例允許實現在這種情況下炸掉,那麼實現就必須正確處理這種情況,否則就是bug。

但是檢查位址也還是太單純:即使檢查位址發現物件不在容器內,如果它持有指向容器內物件的指標,那麼還是可能會炸。正確的做法是在移動/複製現有元素之前,先把新元素構造好,只有這樣才能做到不管新元素的構造如何依賴現有元素,都有正確的行為。

我檢查了一下libstdc++和libc++的最新版(trunk),二者都是這麼做的。——但是舊版本就不一定了。

關於標準委員會的看法,參見 LWG 2164 。

為何念經

念記憶 記住 深切注意 警惕 惦記 讀 研習 極短的時間 想法 反反覆覆述說著。記住。論語 公冶長 伯夷 叔齊,不念舊惡,怨是用希。念attention,remember,note,keep in memory,satindriya,Recollection,attention,to read,to...

法國為何廢除君主而英國為何保留君主?

zoey 根本上來說國情不同。具體受多重因素影響。英國有歷史上限制王權的傳統,率先開始工業革命,資本主義發展比較充分。而法國國內政權不穩,政權多次更迭,主要國內資本主義發展不充分,資產階級力量較為弱小。最終投票僅以一票勝過君主派確立了共和制。 我是這樣理解的 革命之前,英國的君主已經和革命者妥協過了...

為何說李香君為何不該遇上候方域?

青木春望 林黛玉不該遇上賈寶玉,不然也不必還一生淚水 杜麗娘不該夢見柳夢梅,不然何至青年早夭?崔鶯鶯不該遇見張生,不然從命嫁人也得一生富貴免遭薄倖別離之苦 李師師不該遇見帝王才子,不然何至靖康國破風塵飄零 楊玉環不該嫁給李隆基,如何四紀為天子,不及盧家有莫愁 卓文君不該遇上司馬相如,她拋了一切當壚賣...