样品
void func(void* data)
{
CResource* resource = (CResource*)data;
delete resource; // ~CResource never called.
resource = NULL;
}
请帮助我解决这个问题。
最佳答案
总结了可能无法调用CResource析构函数的可能原因,摘自其他答案:
不完整的类型
一种可能的原因是您仅声明了CResource类型,而未定义:
class CResource;
void func(void* data)
{
CResource* resource = (CResource*)data;
delete resource; // ~CResource never called.
resource = NULL;
}
这是未定义的行为(删除不完整的类型)。在这种情况下,编译器应发出有关未调用的析构函数的警告(Visual C++确实会发出警告)。如果是这种情况,请确保在销毁它的位置定义了类型(包括必需的 header )。
空指针
如果data为NULL,则delete不会执行任何操作,也不会调用任何析构函数。
类型不匹配
如果CResource析构函数是虚拟的,并且存储在数据所指向的内存中的对象实际上是另一种类型,则您将获得未定义的行为。通常,将调用其他析构函数(如果对象具有另一个虚拟析构函数),在其他情况下,程序可能会崩溃(如果对象没有虚拟析构函数)。