6

我现在正在学习关于 GIS 编程的 C++ 编程课程。我真的开始因为处理适当的内存管理而头疼。考虑到任何时候通常都有 8-10 个类,每个类都持有一个指向 3D 矩阵或其他非常大的东西的指针。现在我们的班级已经提出了 prof 允许我们使用 Boost 的问题,或者至少是 2008 年的 C++ Feature Pack(对于 TR1)。他拒绝了,但说如果我们愿意,我们可以找到添加一些第三方 cpp/hpp 文件。我已经尝试过让 shared_ptr 脱离 boost ,但这比它的价值更令人头疼。

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

4

7 回答 7

17

使用 boost 的bcp工具。它可以让您从 boost 库中提取某些功能。

bcp shared_ptr /boost_shared_ptr

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

于 2009-10-03T01:58:56.833 回答
4

Lokis ref-counted 智能指针一个机会 - 据我所知,它的耦合度较低,然后提升了头球。

于 2009-10-03T01:51:28.300 回答
3

预处理包含shared_ptr. 将其写入单个 .hpp 文件。这样一来,您将shared_ptr在一个头文件中获得 boost 及其所有依赖项,而无需完整安装 boost。

shared_ptr不需要将任何共享库链接到您的代码,它是一个仅限标头的库......所以这应该可以工作。

于 2009-10-03T01:40:44.667 回答
1

虽然对于生产解决方案来说这将是一个糟糕的想法,但如果你不尝试像 boost 那样成为交叉编译器、灵活和线程安全的类,那么为一个类推出你自己的解决方案并不会太难:

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_;
};
于 2009-10-03T01:58:26.660 回答
1
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

哦,刚刚看到你的教授不允许你使用TR1。倒霉。

于 2009-10-03T19:18:32.737 回答
1

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

您通常可以只使用一个简单的临时 RAII 类,获得对象的独占所有权。

没有 RAII 的内存管理很痛苦,但是没有shared_ptr.

于 2009-10-03T19:56:11.240 回答
1

我刚刚在您的代码示例中发现了一个严重错误。它应该是

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

代替

ref_count_(p ? new int : NULL)

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

于 2010-07-16T18:39:13.473 回答