2012-02-28 8 views
0

外部サービスを介してデータを一部のサーバーにプッシュするアプリケーションを作成します。そこで私はこのために使用する必要が定義された構造であり、それは次のようになります。大きなポインタ構造体を扱う方法

​​

と、それはどこか

class XY { 
    double *some_val; 
    std::string *another_val; 
    ... 
}; 

つまるところ、私が直面しています問題は、私は唯一取り扱っておりますということですポインターのポインタを使ってポインタを指していれば、これらの構造を扱う最良の方法は何かをまだ理解していません。

私はnewdeleteでメモリ管理を自分で処理できるが、私はその後、大規模なクリーンアップを行う必要があると私は何かをクリーンアップすることを忘れて、私のプログラムリークが私の意見では高すぎるチャンスでしょう。

私はクラスをローカルで宣言してそのように宣言することができましたが、事前にすべての変数を宣言しなければならないので、何かをする前にhierachyクラスを分析しなければなりません。 。

スマートポインタも私の心の中に入っていましたが、基本的にポインタをラップするクラスであるため、事前に宣言する必要があります。

これらの大量のポインタ構造を扱うために、スマートで読み書き可能な方法を知っている人はいますか?

更新:誰もが同じ問題に遭遇した場合は(私はまだそれが厄介だと思うけど!)

、これが今の私のアプローチです:

#include <boost/shared_ptr.hpp> 
#include <boost/any.hpp> 

class A { 
    B *b_; 
    double *d_; 
}; 

int main() { 
    std::vector<boost::any> vp; 

    // Create instance of A 
    vp.push_back(boost::shared_ptr<A>(new A)); 
    A *a = boost::any_cast<boost::shared_ptr<A> >(vp.back()).get(); 

    // Create instance of B in A 
    vp.push_back(boost::shared_ptr<B>(new B)); 
    a->b_ = boost::any_cast<boost::shared_ptr<B> >(vp.back()).get(); 

    // etc. 

    return 0; 
} 

アップデート2:

#include <boost/shared_ptr.hpp> 

typedef std::vector<boost::shared_ptr<void> > MemoryManager; 

template <class T> T* create_managed(T *ptr, MemoryManager &memorymanager) { 
    memorymanager.push_back(boost::shared_ptr<T>(ptr)); 
    return boost::static_pointer_cast<T>(memorymanager.back()).get(); 
} 

int main() { 
    MemoryManager mm; 
    A *a = create_managed(new A, mm); 
    a->b_ = create_managed(new B, mm); 
    return 0; 
} 
+1

'boost :: any'の代わりに、' shared_ptr 'を使いたいかもしれません。 – Mankarse

+0

@Mankarseありがとう、それは本当に素晴らしいです。私はあなたの提案で私の質問を更新しました。 – nijansen

答えて

5

smart pointersを使用することを検討してください。 antage:

通常のポインタよりスマートにするには、スマートポインタは通常のポインタでは実行しないことが必要です。これらのことは何ができますか?たぶんC++(とC)の最も一般的なバグは、ポインタやメモリリーク、アロケーションの失敗やその他の喜びなど、ポインタやメモリ管理に関係しているでしょう。スマートなポインターを持っているので、多くのアスピリンを節約できます。

+0

私はsmartpointersを考え、私がここで彼らを助けないと思う理由を説明しました。あなたはもっと詳しく説明できますか? – nijansen

+0

@nijansen:違いは、スマートポインタでは、自動的に生成されたクラスのデストラクタがスマートポインタを破壊し、スマートポインタが参照されなくなったときに自動的にそのオブジェクトを解放します。 –

+0

はい、スマートポインタの仕組みを理解しています。私のポイントは - スマートポインタはスコープがなくなったときに自分自身をきれいにするので、すべてのスマートポインタを事前に宣言しなければならず、スマートポインタの配列を扱いにくくなってしまいます。 )私はクラスのインスタンスをローカルに宣言することよりも利点があるとは思わない。 – nijansen

1

スマートポインターが必要です。彼らの実装はたくさんありますが、あなた自身で書くこともできます。それらを適切な方法で使用すると、クラスの削除に気にする必要はありません。

関連する問題