析构函数中清空向量是否可行?

3
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:vector相同。
我不想删除M类的指针M*。
以下代码是否正确或您是否发现任何问题?
A::~A() {
   EMapItr eMItr = p_Map.beginRandom();
   for(; eMItr; ++eMItr) {
      delete eMItr.value();
   }
}

我们需要像下面这样清除向量吗?还是它会被自动处理? E::~E() { mv.clear() }

注意,以上内容涉及IT技术。


你自定义的迭代器EMapItr破坏了C++11的for循环。特别是,C++11现在假设容器有一个叫做_确切_ begin() 的方法。而不是beginRandom。你仍然可以通过一个小技巧,在一个容器上有多种迭代方式:p_Map.randomView.begin() - MSalters
1个回答

8

标准库容器不需要在析构函数中清除,因为它们会自行处理内存管理。最好也这样做你自己的容器,因为这是通常期望的,并且这是避免内存问题的最佳方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接