2011-11-16 55 views
1

我是boost::smart_ptr庫的長期用戶,並且很喜歡它。像所有的boost庫一樣,它的設計與C++標準庫很好地配合。這通常是件好事。沒有標準庫的C++智能指針

可惜,我面臨的情況是我需要的是完全獨立的標準庫。儘管如此,我仍然需要與boost::smart_ptr提供的功能相同的功能(除了std::)之外,顯然每件事都有關係。這包括保留計數,bool和 - >運算符的超載,week_ptrshared_ptr之間的關係等。

有沒有人遇到過這種情況?我正在研究使用boost::smart_ptr作爲起點並替換/刪除std::相關的事情。但看着複雜性,我越來越擔心打破事情。

+1

只是出於興趣,爲什麼你不能使用std庫。我很想知道這是什麼時候的需求 – flipchart

+3

你想獨立於boost還是標準庫?沒有標準庫,它不再是真正的C++。 – juanchopanza

+0

我不明白這個問題。你不能使用std或者你不能使用boost,或者兩者兼有? – ronag

回答

2

Loki圖書館可能會幫助你,它有一個SmartPtr類。它使用std(std :: swap,std :: runtime_error),但似乎並沒有太難去除它。

+0

謝謝,我會看看它! – jbat100

+0

謝謝,它與我正在尋找的東西最接近,並且清楚地知道他們在說什麼...... – jbat100

1

您可能也有興趣libc++

這是一個帶有自由許可(MIT或類似BSD)的C++標準庫的實現,以便您可以自由選擇它。

所有的流處理都非常複雜(很多語言環境的東西),然而STL部分(容器和算法)以及部分數字內容(格式除外)可以開箱即用。

如果您需要流媒體,則需要多一點參與。

最後,您最大的問題可能來自異常處理。請注意,標準庫通常應該啓用異常(例如,std::out_of_range),異常管理通常基於外部庫(例如,請參閱libunwind)。當然,由於您重新實現了自己的圖書館,因此您可以選擇assert而不是投擲。

我會認真的提醒不要使用異常,因爲它會讓你在關心的所有設備上工作(這是一個殘缺的C++,但仍然可以獲得對象和模板)。

0

古典的參考計數。一些基本代碼看起來像這樣(我設法生成的最短代碼)。除非你對引用計數一無所知,否則應該是直截了當的。

template <class CL> 
struct refCount { 
    refCount() : nlinks_(1) , p_(0) {} 
    refCount(CL*p) : nlinks_(1) , p_(p) {} 
    ~refCount() { if (!nlinks_) delete p_;} 
    size_t nlinks_; 
    CL* p_; 
    }; 

template <class CL> 
class mySmartPtr { 
public: 
    mySmartPtr() : rc_(new refCount<CL>()) {} 
    mySmartPtr(CL* p) : rc_(new refCount<CL>(p)) {} 
    mySmartPtr(const mySmartPtr<CL> & otherSmartPtr) : rc_(otherSmartPtr.rc_) { rc_->nlinks_++ ;} 
    mySmartPtr & operator=(const mySmartPtr<CL> & otherSmartPtr)  { 
     otherSmartPtr.rc_->nlinks_++; 
     if (!(-- rc_->nlinks_)) delete rc_; 
     rc_ = otherSmartPtr.rc_; 
     return *this;} 
    CL& operator *() {return * rc_->p_ ; } 
    ~mySmartPtr() { if(!(--rc_->nlinks_)) delete rc_;} 
// commented to print #links (remove it) 
// protected: 
    refCount<CL> *rc_; 
     }; 

如果您需要動態/靜態轉換(線程安全),需要更多的工作。使用

例子:

int main() 
{ 
mySmartPtr<int> i; 
i = mySmartPtr<int>(new int(1)); 
*i = 7; 
mySmartPtr<int> j(new int(3)); 
j = i; 
std::cout << *j << std::endl ; // prints 7 
std::cout << i.rc_->nlinks_ << std::endl ; // prints 2, i and j point to the same 
{ 
    mySmartPtr<int> k(j); 
    std::cout << i.rc_->nlinks_ << std::endl ; // prints 3, k points there two 
} 
std::cout << i.rc_->nlinks_ << std::endl ; // prints 2 , k gone out of scope 

return 0; 
}