【问题标题】:vector of pointer to object - how to avoid memory leak?指向对象的向量 - 如何避免内存泄漏?
【发布时间】:2011-03-27 17:50:08
【问题描述】:

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

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

  }

【问题讨论】:

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


    【解决方案1】:

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

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

    或唯一指针向量 (C++0x),如果对象实际上在此容器和其他容器之间共享

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

    或使用 boost pointer containers

      boost::ptr_vector<A> l;
    

    PS:不要忘记 A 的虚拟析构函数,正如 @Neil Butterworth 所说!

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 2013-04-06
        • 2018-07-15
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 2020-05-13
        相关资源
        最近更新 更多