犯過的C++錯誤: vector::swap()函式
阿新 • • 發佈:2019-02-10
在知乎上看到一個問題,問一下程式碼為什麼錯:
//...
vector<int> x;
//....
x.swap(vector<int>(x)); //錯誤出現的地方
我的錯誤解答是:
因為 vector<int>(x) 產生了一個臨時物件,將該臨時物件與 X 進行 swap 操作,交換了對方的三個指標(first,end,finish),指向分配的記憶體空間,然後再該語句結束後,臨時物件被釋放掉,所以此時 x 所指向的記憶體(原來臨時物件的記憶體空間)被釋放了, 而 x 原本的記憶體則發生了洩露
解釋的漏洞:
兩個 vector 物件交換指標後,臨時物件所指向的記憶體就更新為原本x 的記憶體了,臨時物件被銷燬時將呼叫臨時物件的解構函式,該解構函式釋放的是臨時物件現在所指記憶體空間。因此,原本的X所指的記憶體空間將被釋放,而現在X所指的記憶體空間將仍然保留。因此錯誤不出現在這個地方
正確的解答:
臨時物件不能繫結到非const引用上!!!!!!!!!
因為 swap 的函式原型為:
<span style="font-size:14px;">void swap(vector<T, Alloc>& x</span>)
可以看到,如果按上述的寫法,則希望將臨時物件繫結到一個非const引用上,將會在繫結的過程中報錯。但是VS2013執行上述語句時已經不報錯了,而G++仍然報錯