2011-11-16 58 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; 
}