此問題摘自stackoverflow。
先回顧一下我們需要的知識。swap手法。用於編寫省事的代碼。核心當然就是使用std::swap了
如果有特殊需求,則編寫class::swap。
我們來回顧下std::swap
swap(T& a, T& b大概就是這樣了。
下面看下問題
1 #include <algorithm>
2
3 template<typename T>
4 struct buffer
5 {
6 // create a buffer of length n
7 buffer(unsigned n) : rc(*(new unsigned(1))), data(new T[n]) { }
8
9 buffer(const buffer<T> & rhs) : rc(++rhs.rc), data(rhs.data) { }
10
11 buffer<T>& operator=(buffer<T> rhs)
12 {
13 std::swap(rc, rhs.rc);
14 std::swap(data, rhs.data);
15 return *this;
16 }
17
18 ~buffer()
19 {
20 if (--rc == 0) {
21 delete [] data;
22 delete (&rc);
23 }
24 }
25
26 private:
27 mutable unsigned & rc;
28 T * data;
29 };
30
31
32 int main() {
33 typedef buffer<int> numbers;
34 numbers n1(10);
35 numbers n2(20);
36 numbers n3(30);
37 n1 = n2 = n3 = n2;
38 }
好的,問題出來咯。。。。你能看出來麽。。。。
std::swap(rc, rhs.rc);這句
我們來看看真正的應該是怎麽樣呢rc是個mutable int&,方便看我則假設typedef mutable int& xx
我們看到,2重&,實際上還是交換了裏面的值。
問題到了這裡,你看出來了嗎
‘
簡單的說就是類似于上圖,你交換了refcount。但是你卻沒有改變引用。so。最後程序就會崩。
珍愛生命,遠離c++.........