大家好我试图从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;
}
};
答案 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 *指针缺少所有这些信息。