此問題摘自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++.........