2013-08-22 37 views
1

標題幾乎說明了一切,我幾乎肯定它是在複製構造函數或賦值運算符,我敢肯定它是後者。這是一個相當短的課程,所以我會發布整個事情,任何關於如何處理它的建議都會很好。我老實說在這裏也有點頭痛,所以任何指向一些可靠的閱讀將不勝感激。捕獲共享指針中的內存泄漏?

#pragma once 

//for non-learning purposes, boost has a good smart pointer 
template <class type> 
class sPtr 
{ 
private: 
    type *p; 
    int r; //referenceCount 

    void add() 
    { 
     r++; 
    } 
    int release() 
    { 
     return --r; 
    } 
public: 
    sPtr(): p(NULL), r(1) {} 
    sPtr(type *pValue): p(pValue) 
    { 
     add(); 
    } 
    sPtr(const sPtr<type> & sp): p(sp.p), r(sp.r) 
    { 
     add(); 
    } 
    ~sPtr() 
    { 
     if(release() == 0) 
     { 
      delete p; 
     } 
    } 

    type* get() 
    { 
     return p; 
    } 

    type& operator*() 
    { 
     return *p; 
    } 
    type* operator->() 
    { 
     return p; 
    } 
    sPtr<type>& operator=(sPtr<type> sp) 
    { 
     std::swap(this->p, sp.p); 
     std::swap(this->r, sp.r); 
     add(); 

     return *this; 
    } 
}; 

我很確定賦值運算符應該通過引用傳遞,但我不確定這將如何影響實現。我嘗試了幾個不同的實現,他們都仍然有泄漏。

回答

5

您的每個共享指針都會跟蹤其自己的單獨引用計數。這顯然不好。當其中一個被破壞時,其他人的引用計數不會更新。您需要將引用計數保存在所有共享指針都可以訪問的單獨位置。

+0

它需要一個相對較大的智能指針類重寫,但我終於得到它的工作。感謝提示,如果沒有它,將無法做到。 – headlessgargoyle

2

除了Ben已經提到的之外,你在默認構造函數中開始引用計數爲1(而不是在其他人中初始化它)。如果你在默認的構造函數後面指定一個指針,那麼你的引用計數爲2,當你調用release時,返回1.簡而言之,只有引用計數爲0(表示你可以刪除對象)是如果您調用版本1,則會調用更多時間而不是添加。通常,您希望這些呼叫是對稱的(呼叫添加對應於呼叫釋放)。