CMemFile Detach 内存泄漏

来源:互联网 发布:java如何清空文件内容 编辑:程序博客网 时间:2024/06/12 21:43

CMemFile::Detach

BYTE* Detach( );

返回值:
返回一个指向包含内存文件内容的内存块指针。

说明:
调用该函数,以获取CMemFile使用的内存块的指针。
调用该函数也关闭了CMemFile。需要调用Attach重新为CMemFile附加内存块。如果希望重新附加该文件,并使用其数据,那么在调用Detach函数之前,应当调用CFile::GetLength以获取文件的长度。要注意的是如果已经为CMemFile附加了内存块,这样就可以使用其数据(nGrowBytes == 0),同样,也不能增大内存文件。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

转到CMemFile::Detach的源码:

BYTE* CMemFile::Detach()
{
    BYTE* lpBuffer = m_lpBuffer;
    m_lpBuffer = NULL;
    m_nFileSize = 0;
    m_nBufferSize = 0;
    m_nPosition = 0;

    return lpBuffer;
}

显然这里申请的内存指针直接交给用户了,CMemFile对象也基本无用了,所以要手动释放,即:

BYTE* pbBuff= (BYTE*)new char [1024];
memset(pbBuff, 0, 1024);
memcpy(pbBuff, "hello", sizeof("hello"));
CMemFile mf;
mf.SeekToEnd();
mf.Write(pbBuff,1024);
delete[] pbBuff;

BYTE* lpBuffer = mf.Detach();
CString strSocket(lpBuffer);
free(lpBuffer);//CMemFile的内存使用malloc申请的

 

0 0
原创粉丝点击