2010-08-10 26 views
0

我們如何處理一個向量,其元素是指向對象的向量?我的具體問題是下面提供的代碼末尾的註釋。謝謝。指向對象的指針向量 - 如何避免內存泄漏?

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

    } 

回答

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:不要忘記上的A按照@Neil Butterworth的慣例破壞者!

+0

+1對於C++ 0x unique_ptr – rubenvb 2010-08-10 10:42:23

+1

對於boost指針容器+1。 – 2010-08-10 11:52:54

+0

大家好,我使用的VS2010可能有shared_ptr。有一個我可以看看的例子嗎? --thx – q0987 2011-05-19 23:46:22

5

使用shared_ptr數組或類似的智能指針。請注意,您的基類必須具有虛擬析構函數才能使此代碼正常工作。

0

最好的方法是使用智能指針(Boost shared_ptr)來避免這種事情。但是如果你需要有原始指針,我相信這是做到這一點的方法。