用了這么久的C++,才發(fā)現(xiàn)C++是目前所有的編成語言中最為復(fù)雜的一種,C++之路, 艱難.....
delete void *
這一操作對于一些簡單的系統(tǒng)內(nèi)建類型不會有問題,但如果void*所指向的對象在析構(gòu)函數(shù)里要釋放,進(jìn)行此造作會丟失內(nèi)存,因?yàn)樗粓?zhí)行析構(gòu)函數(shù),例如:
class CEntity
{
public:
CEntity(char flag);
~CEntity();
private:
void * m_data;
char m_flag;
};
CEntity::CEntity(char flag)
{
m_flag = flag;
cout<<"constructing entity "<<m_flag<<endl;
m_data = new char[100];
}
CEntity::~CEntity()
{
cout<<"destructing entity "<<m_flag<<endl;
delete[] m_data;
}
以上這個(gè)類是沒什么問題的,但是看以下的調(diào)用:
int main(int argc, char* argv[])
{
CEntity * a = new CEntity('a');
delete a;
void * b = new CEntity('b');
delete b;
return 0;
}
其輸出為: constructing entity a
destructing entity a
constructing entity b
可見,delete b 的時(shí)候沒有釋放m_data所指向的內(nèi)存,沒有執(zhí)行析構(gòu)函數(shù)。