nij*_*sen 0 c++ pointers memory-management
我编写的应用程序通过外部服务将数据推送到某个服务器.我必须使用一个定义的结构,它看起来像这样:
class A {
B *b; // Another class built the same principle
C *c; // And another one
...
};
Run Code Online (Sandbox Code Playgroud)
它在某处归结为
class XY {
double *some_val;
std::string *another_val;
...
};
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,如果你愿意,我只处理指针指针,我还没有想出处理这些结构的最佳方法.
我自己可以用new和处理内存管理delete,但是之后我不得不做大量的清理工作,而且我忘记清理一些东西,而我的程序漏洞在我看来太高了.
我可以在本地声明这些类并以这种方式填充它们,但是我必须事先声明每个变量,所以我必须在我可以做任何事情之前分析类层次结构,之后它仍然会变得非常混乱.
智能指针也出现在我脑海中,但由于它们基本上是一个包装指针的类,我必须事先声明它们,相比之前方法的优势似乎很小.
有没有人知道一个聪明的,最重要的是,可读/可维护的方法来处理这些庞大的指针结构?
更新:
如果有人遇到同样的问题,这是我现在的方法(虽然我仍然觉得它很乱!):
#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;
}
Run Code Online (Sandbox Code Playgroud)
更新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;
}
Run Code Online (Sandbox Code Playgroud)