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

Cant delete void pointer from vector in c++

本文关键字:删除 空心 指针 向量 c++      更新时间:2023-10-16

大家好,我正试图从向量中删除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; 
   }

};

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

使用vector<T*>而不是vector<void*>。例如,如果您有从基类继承的vector<void*>,则在删除它之前必须将指针强制转换为T*

delete static_cast<T*>(*it);

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

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

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

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