2012-02-28 10 views
0

STDに格納されているオブジェクトを削除::だけで簡単に小さな質問ベクトル

#define SAFE_DELETE(p) if((p)) { delete(p); (p) =NULL; } 
#define SAFE_DELETE_A(pa) if((pa)) { delete[](pa); (pa)=NULL; } 

    // Add objects to our vector 
    for(int a = 0; a< 150; a++) 
    { 
     CObject *pNewObject = new CObjectPlane(...) 
     m_vpObjects.push_back(pNewObject); 

    } 


    // Delete all objects stored in our vector 
    std::vector<CObject*>::iterator itObject; 
    for(itObject = m_vpObjects.begin(); itObject!=m_vpObjects.end();) 
    { 
     SAFE_DELETE((*itObject)); 
     itObject = m_vpObjects.erase(itObject); 
    } 

    m_vpObjects.clear(); 

1)は、そのSTDに格納されたオブジェクトを削除します::ベクトル(CObjectの*)

2)に、それは安全ですこの方法でそれらを削除しますか?

+6

あなたのSAFE_DELETE()はばかばかしいです。 C++は、NULLポインタの削除がnoopであることを保証するので、最初にチェックする必要はありません。 – FatalError

+1

また、これらの#defineは良い考えではないと思います。それらはいくつかの副作用を引き起こす可能性があります。いくつかの種類のスマートポインタの代わりにrawポインタを使用する必要がありますか? –

答えて

4

安全ですが、(非常に)遅くなる可能性があります。

eraseは、ベクトルの他のすべての要素を移動する必要があるため、ループはベクトルのサイズでO(n^2)です。

要素が(a)ポインタ(デストラクタなし)であり、(b)clearがそれを実行するので、要素はeraseの必要はありません。だから、

for (itObject = m_vpObjects.begin(); itObject!=m_vpObjects.end(); ++itObject) 
    SAFE_DELETE((*itObject)); 

P.S.あなたのSAFE_DELETEについて特に安全なものは何もありませんが、それは別の話題です。

P.P.S. if (p) delete p;は冗長です。

+0

すべてクリア、ありがとう。 – PeeS

+0

@ピース - はい。 'clear'はすべての要素を一つずつ消去するのと同じ効果があります。 – Nemo

1

ベクタ内の生ポインタの代わりにスマートポインタ(たとえば、boostまたはC++ 0xから)を保存して保存してください。これにより、安全に解放する負担から解放されます。

勝利のためのRAII(Resource Acquisition is Initialization)

関連する問題