C++ 测试C+中的无效指针+;删除前

C++ 测试C+中的无效指针+;删除前,c++,memory,valgrind,void-pointers,delete-operator,C++,Memory,Valgrind,Void Pointers,Delete Operator,我在C++中有一个数组: Player ** playerArray; 它在所属类的构造函数中初始化 在析构函数中,我有: delete playerArray; 除了通过Valgrind测试程序外,它说有一些对void指针的删除调用: operator delete(void*) 在调用delete之前,我想测试playerArray是否为空指针以避免此错误 有人知道怎么做吗?也许你的意思是delete[]playeray。如果指针是数组,而不是单个实例,则需要[]。我认为valgri

我在C++中有一个数组:

Player ** playerArray;
它在所属类的构造函数中初始化

在析构函数中,我有:

delete playerArray;
除了通过Valgrind测试程序外,它说有一些对void指针的删除调用:

 operator delete(void*)
在调用delete之前,我想测试playerArray是否为空指针以避免此错误


有人知道怎么做吗?

也许你的意思是
delete[]playeray
。如果指针是数组,而不是单个实例,则需要
[]

我认为valgrind警告的是,删除是在以下情况下发生的:

int foo(void *mydata){
{
    SomeClass some_value = static_cast<SomeClass> mydata;
    some_value.dosomething();
    // now we're done with it
    delete mydata;
}
intfoo(void*mydata){
{
SomeClass some_value=静态_转换mydata;
一些值。dosomething();
//现在我们结束了
删除我的数据;
}

虽然强制转换很好,但由于您碰巧知道void指针实际上就是该类型,您仍然在做一些可疑的事情,因为您删除的是void指针,而不是类型化指针。如果某个类是POD,这可能没问题,但如果它在其析构函数中必须执行一些关键工作,则该析构函数永远不会被调用

下面是如何定义运算符delete

void operator delete(void*) throw();
void operator delete[](void*) throw();
“运算符删除”采用“void*”,因为指向任何对象的指针都可以转换为“void*”

请注意,void是一种不完整的类型,因此不允许删除void*,即

char *p = new char;
void *pv = p;
delete pv;            // not allowed
脚注78:这意味着 对象不能使用 类型为void*的指针,因为void是 不是对象类型


如果playerarray是指向玩家数组的指针,您很可能希望以不同的方式进行操作。
delete pplayer
并不能满足您的要求。

使用向量(如果我正确理解您是如何使用它的)或类似类型(如a),而不是。如果它是指向某些对象的指针数组,则删除数组本身不会释放其地址存储在该数组中的对象。您需要使用
for
循环删除对象,然后
删除[]
数组。