2016-03-22 29 views
1
class M { 
}; 

class E { 
    public: 
    ~E();  
    private: 
    MyVector mv; 

}; 

E::~E() { 
    mv.clear() 
} 

typedef MyHashMap<M*, E*> EMap; 
typedef MyHashMap<M*, E*>::iterator EMapItr; 

class A : public class Base { 

    public: 
     ~A(); 
     const EMap& getEMap() { return p_emap}; 
     virtual void func(); 

    protected: 
     EMap p_Map; 
}; 

A::~A() { 
    EMapItr eMItr = p_Map.beginRandom(); 
    for(; eMItr; ++eMItr) { 
     delete eMItr.value(); 
    } 
} 
class DB { 
    public fill(EMap* p_Map); 
}; 

class Derived: public A { 
    private: 
     DB dp; 
}; 

class GUI { 
    public: 
     void guiFunc(); 
} 

void GUI:guiFunc() { 
    Derived* d = new Derived; 
    d->func(); 

} 

void Derived::func() { 
    db.fill(&p_map); 
} 

請注意MyHashMap是我自定義的散列表。功能與std相同:hashmap 請注意MyVector是std :: vector的自定義形式。該功能是一樣的STD:向量是否可以清除析構函數中的向量

我不想刪除M級M *的指針

是下面的代碼正確或不喲看到在同一

A::~A() { 
    EMapItr eMItr = p_Map.beginRandom(); 
    for(; eMItr; ++eMItr) { 
     delete eMItr.value(); 
    } 
} 

而且什麼問題我們需要明確的矢量如下否則將被自動照顧 Ë::〜E(){ mv.clear() }

+0

你的自定義迭代器'EMapItr'打破了C++ 11 for循環。特別是,C++ 11現在假定容器有一個名爲_exactly_'begin()'的方法。不是'beginRandom'。您仍然可以通過多種方法通過一個小技巧遍歷單個容器:'p_Map.randomView.begin()'。 – MSalters

回答

5

標準庫容器並不需要在析構函數被清除因爲他們照顧自己的記憶管理。最好還是對自定義容器執行相同的操作,因爲這通常是預期的,並且無論如何是避免內存問題的最佳方法。

相關問題