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

时间:2010-08-10 10:02:59

标签: c++ memory-leaks vector observer-pattern

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

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 个答案:

答案 0 :(得分:7)

是的,你必须这样做才能避免内存泄漏。更好的方法是创建一个共享指针的向量(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;
PS:根据@Neil Butterworth,不要忘记A的虚拟析构函数!

答案 1 :(得分:5)

使用shared_ptr或类似智能指针的数组。请注意,您的基类必须具有虚拟析构函数才能使此代码正常工作。

答案 2 :(得分:0)

最好的方法是使用智能指针(Boost shared_ptr)来避免这种情况。但是如果你需要有原始指针,我相信这是做到这一点的方法。