代码之家  ›  专栏  ›  技术社区  ›  pierrotlefou

指向对象的指针向量-如何避免内存泄漏?

  •  0
  • pierrotlefou  · 技术社区  · 14 年前

    我们通常如何处理元素是指向对象的指针的向量?我的具体问题是下面提供的代码末尾的注释。谢谢。

    class A
    {
     public:
     virtual int play() = 0 ; 
    };
    
    class B : public A 
    {
    public:
     int play() {cout << "play in B " << endl;};
    
    };
    
    class C : public A 
    {
    public:
     int play() {cout << "play in C " << endl;};
    
    };
    
    
    int main()
    {
    
        vector<A *> l;
        l.push_back(new B());
        l.push_back(new C());
    
        for(int i = 0 ; i < l.size();i++)
        {
                l[i]->play();
        }
    
        //Do i have to do this to avoid memory leak? It is akward. Any better way to do this? 
        for(int i = 0 ; i < l.size();i++)
        {
                delete l[i];
        }
    
      }
    
    3 回复  |  直到 14 年前
        1
  •  7
  •   Cubbi    14 年前

    是的,您必须这样做以避免内存泄漏。更好的方法是创建共享指针的向量( boost ,C++Tr1,C++0x,

     std::vector<std::tr1::shared_ptr<A> > l;
    

    如果对象不是实际的,则指向唯一指针(c++0x)的向量 共享 在这个容器和其他东西之间

     std::vector<std::unique_ptr<A>> l;
    

    或使用助推 pointer containers

      boost::ptr_vector<A> l;
    

    附言:别忘了A的虚拟析构函数,就像@neil butterworth!

        2
  •  5
  •   anon    14 年前

    使用共享指针数组或类似的智能指针。注意,为了使代码正确工作,您的基类必须有一个虚拟析构函数。

        3
  •  0
  •   Gabriel Rodriguez    14 年前

    最好的方法是使用智能指针( Boost shared_ptr )为了避免这种事情。但是如果你需要原始的指针,我相信这是你的方法。