如何处理大型指针结构

时间:2012-02-28 12:26:17

标签: c++ pointers memory-management

我编写的应用程序通过外部服务将数据推送到某个服务器。我必须使用一个定义的结构,它看起来像这样:

class A {
    B *b; // Another class built the same principle
    C *c; // And another one
    ...
};

它可以归结为

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

我面临的问题是,如果你愿意的话,我只处理指针指针的指针,而且我还没有弄清楚处理这些结构的最佳方法是什么。

我可以使用newdelete来处理内存管理,但之后我必须进行大规模的清理工作,而且我忘记清理某些内容并且我认为程序泄漏太高了

我可以在本地声明这些类并以这种方式填充它们,但是我必须事先声明每个变量,所以我必须在我可以做任何事情之前分析类层次结构,之后它仍然会变得非常混乱。

智能指针也出现在我的脑海中,但由于它们基本上是一个包装指针的类,我必须事先声明它们,相比之前方法的优势似乎很小。

有没有人知道一个聪明的,最重要的是,可读/可维护的方法来处理这些庞大的指针结构?

更新

如果有人遇到同样的问题,现在这是我的方法(虽然我仍然觉得它很麻烦!):

#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;
}

2 个答案:

答案 0 :(得分:5)

考虑使用smart pointers,它们有很大的优势:

  

为了比常规指针更聪明,智能指针需要做常规指针不能做的事情。这些东西会是什么?可能C ++(和C)中最常见的错误与指针和内存管理有关:悬空指针,内存泄漏,分配失败和其他喜欢。有一个智能指针照顾这些东西,可以节省大量的阿司匹林......

答案 1 :(得分:1)

智能指针是您所需要的。他们有很多实现,或者你可以编写自己的。以正确的方式使用它们,您不必关心删除您的课程。