void*不是一个指向对象类型的指针 - void **的铸造错误



我有一个正在接收void **的函数退出,我需要将其传递给正在接收数据架构*的新功能。

问题在于,DS中的数据被垃圾取代。我该怎么办?

void Quit(void** DS){
       DataStructure* ds = (DataStructure*) *DS;
       return ds->Quit(); //'void*' is not a pointer to object type
}

当第二个Quit()的定义为:

void DataStructure::Quit();

,主呼叫如下:

DataStructure *data;
Quit((void**) &ds);

如果我们施放如下:

我们得到相同的结果
 DataStructure* ds = reinterpret_cast<DataStructure*>(*DS);      

铸件有效,它不会像您期望的那样更改DS的类型。

((DataStructure*)* DS)转换*DS的值并将结果扔掉。
(您的编译器可能已经警告您没有效果。)

您需要保存转换的结果:

void Quit(void** DS){
       DataStructure* ds = (DataStructure*) *DS;
       return ds->Quit();
}

如果您的DS变量实际上是DataStructure*,则可以简单地施放它:

void Quit(void** DS)
{
       DataStructure* ds = (DataStructure*)DS;
       return ds->Quit();
}