写个代码很容易表达意思
class A
{
private:
int *pTemp;
public:
A(){pTemp= new int[16];}
~A(){delete[] pTemp;}
};
int main()
{
A *pA = new A();
void *p = pA;
delete p;
return 0;
}
上面的代码问题就是pA被强转为void*后delete掉了没有调用A的析构函数造成了内存泄露,结果就是杯具了
最近困扰服务器内存泄露的烦恼就是在这里,服务器跑不了多久就歇菜了,就是因为在一个update中一直在刷新一个保存void*的然后delete这个void*,其实本来不是用void*保存的,而是实际类的指针,只是后来又增加了一种新的结构体,自己图个简单就改成了void*,反正都有统一的delete地方,从来没想过这里会内存泄露,没有想到delete void*是不做类型检查而调用相应的析构函数
实际的解决方案倒是好解决,继承个只有虚析构函数的基类或者在delete的地方自己弄明白具体的实际类型