体面的shared_ptr实现不需要庞大的库?

时间:2009-10-03 01:28:37

标签: c++ shared-ptr

我正在参加GIS编程的C ++编程课程。我真的开始从处理适当的内存管理中获得很多麻烦。考虑到任何时候通常有8-10个类,每个类都有一个指向3D矩阵的指针或其他非常大的指针。现在我们的课程已经提出了教授的问题,允许我们使用Boost,或至少使用2008年的C ++ Feature Pack(针对TR1)。他拒绝但是说如果我们想要我们可以找到添加一些第三方cpp / hpp文件。我已经尝试过将shared_ptr从提升中解脱出来,但这比其价值更令人头疼。

那里有任何类型的免费shared_ptr实现吗?

7 个答案:

答案 0 :(得分:17)

使用boost的bcp工具。它将允许您从boost库中提取某些功能。

bcp shared_ptr /boost_shared_ptr

将提取shared_ptr及其对该目录的依赖。

答案 1 :(得分:4)

Lokis重新计算的智能指针一个镜头 - 据我所知,它更少耦合,然后提升标题。

答案 2 :(得分:3)

包含shared_ptr定义的预处理提升标头。将其写入单个.hpp文件。通过这种方式,您可以在一个头文件中获得boost shared_ptr及其所有依赖项,而无需完全安装boost。

shared_ptr不需要任何共享库链接到您的代码,它是一个仅限标题的库...所以这应该有用。

答案 3 :(得分:1)

虽然对于生产解决方案来说这是一个可怕的想法,但是如果你没有尝试成为交叉编译器,那么为一个类推出自己的想法就不会太难了和线程安全的提升:

template <typename contained>
class my_shared_ptr {
public:
   my_shared_ptr() : ptr_(NULL), ref_count_(NULL) { }

   my_shared_ptr(contained * p)
     : ptr_(p), ref_count_(p ? new int : NULL)
   { inc_ref(); }

   my_shared_ptr(const my_shared_ptr& rhs)
     : ptr_(rhs.p), ref_count_(rhs.ref_count_)
   { inc_ref(); }

   ~my_shared_ptr() {
     if(ref_count_ && 0 == dec_ref()) { delete ptr_; delete ref_count_; }
   }
   contained * get() { return ptr_; }
   const contained * get() const { return ptr_; }

   void swap(my_shared_ptr& rhs) // throw()
   {
      std::swap(p, rhs.p);
      std::swap(ref_count_, rhs.ref_count_);
   }

   my_shared_ptr& operator=(const my_shared_ptr& rhs) {
        my_shared_ptr tmp(rhs);
        this->swap(tmp);
        return *this;
   }

   // operator->, operator*, operator void*, use_count
private:
   void inc_ref() {
      if(ref_count_) { ++(*ref_count_); }
   }

   int  dec_ref() {
      return --(*ref_count_);
   }

   contained * ptr_;
   int * ref_count_;
};

答案 4 :(得分:1)

#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

ow,刚刚看到你的教授不允许你使用TR1。艰难的运气。

答案 5 :(得分:1)

你真的需要共享所有权吗?

你可以经常使用一个简单的ad hoc RAII类来获取对象的独占所有权。

没有RAII的内存管理很痛苦,但你得到的RAII没有shared_ptr

答案 6 :(得分:1)

我刚发现你的代码示例中存在严重错误。 它应该是

ref_count_(p ? new int(0) : NULL)

而不是

ref_count_(p ? new int : NULL)

计数器应初始化为0。 如果不是你所有的智能指针都不再聪明。 所有那些做错误的程序员在以后的调试中付出了很多代价, 你应该像编译器一样思考,并采取行动......