ワshared_ptr実施を必要としない大規模なのですか?
-
19-09-2019 - |
質問
を取っていただくたC++によるプログラムクラスの現在のGISプログラミング思ったよりずっとかテルのすぐ近くは飲食面では貧弱頭痛からの対応と適切なメモリ管理.を考えずに時間が8日(火)-10日(木)の授業を持つのポインタを3次元マトリクスまたは何か非常に大きい。今までについて問題提起をしたうえで、教授を利用できあげ、または転のC++特徴パック2008年(TR1).彼は断ってしまったのも、ほかの第三者cpp/hppファイルです。また見てくshared_ptrの向上がり、頭痛りです。
ではある種の無料shared_ptr実行あるのですか?
解決
ブーストの BCP に使用しますツール。それはあなたがBoostライブラリから特定の機能を抽出できるようになる。
bcp shared_ptr /boost_shared_ptr
は、shared_ptrのを抽出し、それがそのディレクトリへの依存関係です。
他のヒント
のLoki のREF-数えスマートポインタ打撃を与えます - 。私の知る限りリコールとしてその少ないしヘッダを高め結合
shared_ptr
の定義を含む前処理ブーストヘッダ。単一.HPPファイルに書き込みます。あなたが得られます。この方法では、ブーストの完全インストールを必要とせずに、1つのヘッダファイルに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;
OW、ちょうどあなたがTR1を使用できるようにdoesntのご教授を見ました。タフな運ます。
あなたは本当に多くの所有権を共有する必要があるのですか?
あなたは、多くの場合、オブジェクトの排他的所有権を取って、単純なアドホックRAIIクラスとによって得ることができます。
RAIIのないメモリ管理が痛みはあるが、あなたshared_ptr
なしのget RAIIます。
私は自分のコードサンプルで重大なミスを見つけました。 それがあるべき
ref_count_(p ? new int(0) : NULL)
の代わりに
ref_count_(p ? new int : NULL)
カウンタが0に初期化する必要があります。 すべてではないが、あなたのスマートポインタはもうスマートではありません。 デバッグに多く、後でそれをそれらの小さな間違いの支払を行うすべてのものをプログラマ、 あなたは、コンパイラのように考えると、それのように行動しなければならない....