我是boost::smart_ptr
图书馆的长期用户并且喜欢它。与所有boost库一样,它的设计与C ++标准库配合得很好。这通常是一件好事。
不幸,我面临的情况是我需要完全独立于标准库。尽管如此,我还需要与boost::smart_ptr
提供的功能相同的功能(除了显然与std::)有关的所有内容。这包括保留计数,bool的超载和 - >运营商,week_ptr
和shared_ptr
等之间的关系
有没有人遇到过这种情况?我正在考虑使用boost::smart_ptr
作为起点并替换/删除std::
相关内容。但考虑到复杂性,我越来越关注破坏事物。
答案 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;
}