6

現在、GIS プログラミングの C++ プログラミング クラスを受講しています。適切なメモリ管理を扱うことから、私は本当に多くの頭痛の種になり始めています。いつでも 8 ~ 10 個のクラスがあり、それぞれが 3D マトリックスまたはその他の非常に大きなものへのポインターを保持していることを考慮してください。現在、私たちのクラスはすでに、Boost、または少なくとも 2008 年の C++ Feature Pack (TR1 用) を使用できるようにする prof の問題を提起しています。彼は拒否しましたが、私たちが望むなら、いくつかのサードパーティの cpp/hpp ファイルを追加できると言いました。私はすでに shared_ptr をブーストから外そうとしましたが、それはその価値よりも頭痛の種です。

では、無料の shared_ptr 実装はありますか?

4

7 に答える 7

17

ブーストのbcpツールを使用します。ブースト ライブラリから特定の機能を抽出できます。

bcp shared_ptr /boost_shared_ptr

shared_ptr とそのディレクトリへの依存関係を抽出します。

于 2009-10-03T01:58:56.833 に答える
4

Lokis ref- counted smart pointer を試してみてください - 私が覚えている限りでは、その結合が少ないとヘッダーがブーストされます。

于 2009-10-03T01:51:28.300 に答える
3

の定義を含むブースト ヘッダーを前処理しますshared_ptr。単一の .hpp ファイルに書き込みます。このようにshared_ptrして、boost を完全にインストールする必要なく、boost とそのすべての依存関係を 1 つのヘッダー ファイルで取得できます。

shared_ptr共有ライブラリをコードにリンクする必要はありません。これはヘッダーのみのライブラリです...したがって、これは機能するはずです。

于 2009-10-03T01:40:44.667 に答える
1

本当に共有所有権が必要ですか?

多くの場合、オブジェクトの独占的な所有権を取得して、単純なアドホックRAIIクラスでうまくいくことができます。

RAIIなしのメモリ管理は苦痛ですが、RAIIなしで取得できshared_ptrます。

于 2009-10-03T19:56:11.240 に答える
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

あなたのコード サンプルに重大な間違いを見つけました。そのはず

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

それ以外の

ref_count_(p ? new int : NULL)

カウンターは0に初期化する必要があります。すべてのスマートポインターがスマートではない場合。これらの小さな間違いを犯すすべてのプログラマーは、後でデバッグするときに多額の支払いをします。コンパイラーのように考え、そのように行動する必要があります....

于 2010-07-16T18:39:13.473 に答える
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 に答える