外部サービスを介してデータを一部のサーバーにプッシュするアプリケーションを作成します。そこで私はこのために使用する必要が定義された構造であり、それは次のようになります。大きなポインタ構造体を扱う方法
と、それはどこか
class XY {
double *some_val;
std::string *another_val;
...
};
つまるところ、私が直面しています問題は、私は唯一取り扱っておりますということですポインターのポインタを使ってポインタを指していれば、これらの構造を扱う最良の方法は何かをまだ理解していません。
私はnew
とdelete
でメモリ管理を自分で処理できるが、私はその後、大規模なクリーンアップを行う必要があると私は何かをクリーンアップすることを忘れて、私のプログラムリークが私の意見では高すぎるチャンスでしょう。
私はクラスをローカルで宣言してそのように宣言することができましたが、事前にすべての変数を宣言しなければならないので、何かをする前に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;
}
'boost :: any'の代わりに、' shared_ptr 'を使いたいかもしれません。 –
Mankarse
@Mankarseありがとう、それは本当に素晴らしいです。私はあなたの提案で私の質問を更新しました。 – nijansen