牛骨文教育服务平台(让学习变的简单)
博文笔记

c++ delete void*

创建时间:2013-11-15 投稿人: 浏览次数:136

附注:在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)



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。