没有std库的C ++智能指针

时间:2011-11-16 10:48:56

标签: c++ boost smart-pointers

我是boost::smart_ptr图书馆的长期用户并且喜欢它。与所有boost库一样,它的设计与C ++标准库配合得很好。这通常是一件好事。

不幸,我面临的情况是我需要完全独立于标准库。尽管如此,我还需要与boost::smart_ptr提供的功能相同的功能(除了显然与std::)有关的所有内容。这包括保留计数,bool的超载和 - >运营商,week_ptrshared_ptr等之间的关系

有没有人遇到过这种情况?我正在考虑使用boost::smart_ptr作为起点并替换/删除std::相关内容。但考虑到复杂性,我越来越关注破坏事物。

3 个答案:

答案 0 :(得分:2)

Loki库可以为您提供帮助,它有一个SmartPtr类。它使用std(std :: swap,std :: runtime_error),但它似乎并不太难以摆脱它。

答案 1 :(得分:1)

您可能对libc++感兴趣。

这是C ++标准库的一个实现,它具有自由许可(MIT或类似BSD),因此您可以从中自由选择内容。

所有的流处理都非常复杂(许多语言环境的东西),但STL部分(容器和算法)以及数字内容的一部分(除了格式化)可以开箱即用。

如果你需要溪流,那就更多了。

最后,您最大的问题可能来自异常处理。请注意,标准库通常应该与启用的异常(例如std::out_of_range)一起使用,并且异常管理通常基于外部库(例如,请参阅libunwind)。当然,既然你重新实现自己的库,你可以选择assert而不是扔。

我会认真地建议不要使用异常,因为让它在你关心的所有设备上运行将会是一个很大的痛苦(那时候C ++有点瘫痪,但你仍然得到对象和模板)。

答案 2 :(得分: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;
}