今天忙活了半天,結果發現罪魁禍首在使用了auto_ptr。
auto_ptr本身不含有賦值語義,所以在它賦值給別人(例如傳參時),實際發生的是控制權的轉移。
1 auto_ptr<TYPE> A,B;
2 A = B;
第二行執行完畢后,B的地址為0;
這就是智能指針auto_ptr的缺陷。倘若遇到類似的情況,還是用boost的shared_ptr吧。
另外轉載一篇關于auto_ptr的文章,供自己學習。
http://blog.csdn.net/normallife/archive/2011/02/23/6202930.aspx
因為std::auto_ptr是轉移語義,而STL容器的元素必須是值語義,也就是拷貝語義的。
比如,STL容器都是以副本的形式來保存元素。
std::vector<int> v;
int a = 1;
v.push_back(a);
v[0]也是值為1的int,但不是a..僅僅是一個副本.a的值也并未被改變.
std::auto_ptr<int> p1(new int);
std::auto_ptr<int> p2 = p1;
p2的構造修改了p1的值,使p1交出了對動態分配的int的引用權.此時p1不再引用動態int.這就是轉移語義.
另外,std::auto_ptr為了達到轉移語義的要求,只提供了這樣的一個拷貝構造函數
auto_ptr(auto_ptr&); 而不是通常情況看到的T(const T&); 這就是一個非值語義的表現.
而std::vector因為對元素類型要求是值語義的,所以必須要求元素類型提供T(const T&)的拷貝構造函數.
它不能用于動態創建的數組。
可能是因為大部分時候用std::vector就很合適了,所以沒有與auto_ptr相對應的auto_array。不過如果真的有特殊需要的話,也很容易仿照 std::auto_ptr寫個auto_array。
使用auto_ptr要知道:
1. 智能指針不能共享指向對象的所有權
2. 智能指針不能指向數組。因為其實現中調用的是delete而非delete[]
3. 智能指針不能作為容器類的元素。
浙公網安備 33010602011771號