您的位置:首页 > 编程语言 > C语言/C++

c++ delete void*

2013-11-15 15:08 309 查看
附注:在C语言中,void*型的指针与其它类型的指针直接互相赋值,不用强制转换;在C++中,从其它类型的指针到void*的赋值不用强制转换,但从void *到其它类型的指针的赋值需要强制转换。

正文:

前一段时间看代码: 

RESULT SWF_Storage_FreeFile(void *pBuffer)

{
if (pBuffer) delete[] pBuffer;
return SWF_S_OK;

}

有如下几点疑问;

1.若是built-in类型,不会出现太大的问题,heap能够正常释放。

2.若是cllass对象,则会出现状况。

class Test


public: 
Test(char flag); 
~Test(); 
private: 
void * m_data; 
char m_flag; 

}; 

 Test::Test(char flag) 


m_flag = flag; 
cout<<"constructing entity "<<m_flag<<endl; 

m_data = new char[100]; 
memset(m_data,1,100); 
char* data= (char*)m_data; 
cout << data << endl; 



Test::~Test() 


cout<<"destructing entity "<<m_flag<<endl; 

delete[] m_data; 
char* data= (char*)m_data; 
cout << data << endl; 



int main(int argc, char* argv[]) 


Test * a = new Test('a'); 
delete a; 
a =NULL;

void * b = new Test('b'); 
delete b;
b = NULL; 

return 0; 

[root@localhost c++]# 

delete b; 这条语句不会调用析构函数。造成m_dada分配的heap内存无法释放,内存泄露!

==8501== 

==8501== HEAP SUMMARY:

==8501==     in use at exit: 100 bytes in 1 blocks

==8501==   total heap usage: 4 allocs, 3 frees, 232 bytes allocated

==8501== 

==8501== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1

==8501==    at 0x4A07062: operator new[](unsigned long) (vg_replace_malloc.c:363)

==8501==    by 0x400A7B: CEntity::CEntity(char) (in /home/work/c++/test4)

==8501==    by 0x400BDD: main (in /home/work/c++/test4)

==8501== 

==8501== LEAK SUMMARY:

==8501==    definitely lost: 100 bytes in 1 blocks

==8501==    indirectly lost: 0 bytes in 0 blocks

==8501==      possibly lost: 0 bytes in 0 blocks

==8501==    still reachable: 0 bytes in 0 blocks

==8501==         suppressed: 0 bytes in 0 blocks

==8501== 

==8501== For counts of detected and suppressed errors, rerun with: -v

==8501== ERROR SUMMARY: 305 errors from 10 contexts (suppressed: 4 from 4)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息