样品

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析构函数是虚拟的,并且存储在数据所指向的内存中的对象实际上是另一种类型,则您将获得未定义的行为。通常,将调用其他析构函数(如果对象具有另一个虚拟析构函数),在其他情况下,程序可能会崩溃(如果对象没有虚拟析构函数)。

07-27 18:18