我正在一个C ++编程类,现在的GIS程序。我真的开始获得了很多头痛的处理正确的内存管理。在任何时候考虑到经常有各持一个指向3D矩阵或别的东西,非常大的8-10班。现在,我们的类已经提高了教授的允许我们使用升压问题,或至少在C ++功能包2008(用于TR1)。他拒绝,但表示,如果我们想我们可以发现添加一些第三方的CPP / HPP文件。我已经尝试过寻找得到的shared_ptr了提升,但是是比较头疼超过其价值的。

那么,有没有任何形式的自由的shared_ptr实现了吗?

有帮助吗?

解决方案

使用升压转换器的 BCP 工具。它可以让你从Boost库中提取某些功能。

bcp shared_ptr /boost_shared_ptr

将提取的shared_ptr和它的依赖于该目录中。

其他提示

Lokis REF计数智能指针一个镜头 - 据我召回其较少耦合然后提升头

预处理升压头包含shared_ptr的定义。它写入一个文件.HPP。这样你会得到提升shared_ptr及其在一个头文件中所有的依赖关系,而不需要完全安装升压。

shared_ptr不需要任何共享库链接到你的代码,它是一个只有头库...所以这应该工作。

虽然这将是一个可怕的生产解决方案的想法,也不会太硬推出自己的一类,如果你没有尽可能地做到交叉编译器,灵活和线程安全的,因为提升的:

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_;
};
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

流量,只是看到你的教授犯规让您使用TR1。韧的运气。

你真的需要共同拥有那么多吗?

您可以经常只是一个简单的特设RAII类度日,获取对象的独占所有权。

没有RAII内存管理是一种痛苦,但你一个GET RAII没有shared_ptr

我只是你的代码样本中发现了一个严重的错误。 它应该是

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

代替

ref_count_(p ? new int : NULL)

计数器应该初始化为0。 如果不是所有的智能指针是不聪明了。 所有这些,很多在调试后做它那些微小的失误付出程序员, 你应该考虑像一个编译器和像它......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top