无法从c ++中的向量中删除void指针

时间:2014-04-24 20:16:42

标签: c++ pointers vector void

大家好我试图从vector中删除void指针,程序在删除时崩溃。 非常感谢你!

template <class T> class tArray_t : public vpArr_t {
  virtual ~tArray_t() {

   for (vector<void*>::iterator it = array.begin() ; it != array.end(); )
   {
          vector<void*>::iterator nextElement = it+1;
          delete *it; // here is the crash
          it = nextElement; 
   }

};

2 个答案:

答案 0 :(得分:9)

删除void指针未定义。你得到了你所要求的。

使用vector<T*>代替vector<void*>。如果你是如果从基类继承vector<void*>,则必须在删除之前将指针强制转换为T*

delete static_cast<T*>(*it);

您可能还想节省一些工作并使用boost::ptr_vector

答案 1 :(得分:1)

编译器知道要使用类型指针删除多少字节。想一想,void *指针没有关于它指向的内存的任何信息,没有人知道如何删除像这样的指针。至少,您不知道需要删除的大小,也没有关于要调用哪个析构函数的信息。

Class A;
A * p = new A();
delete p;

当执行delete p时,编译器知道需要调用一个destrcutor,需要清理的内存大小是sizeof(A)。 void *指针缺少所有这些信息。