如果我在GetBuffer之后没有调用ReleaseBuffer怎么办?

时间:2010-02-26 15:06:25

标签: c++ mfc c-strings getbuffer

来自CString to char*,必须在ReleaseBuffer()之后使用GetBuffer()。但为什么?如果我在ReleaseBuffer()之后不使用GetBuffer()会怎样?

有人能告诉我一个例子吗?感谢。

4 个答案:

答案 0 :(得分:11)

我不确定这是否会导致内存泄漏,但您必须致电ReleaseBuffer以确保更新CString的私有成员。例如,ReleaseBuffer会通过查找终止CString字符来更新null的长度字段。

答案 1 :(得分:3)

  

如果我在ReleaseBuffer()之后不使用GetBuffer()会怎样?

我没有使用过MFC(并且希望不会用10英尺的杆子来触摸它)但是,根据经验,只要你的API同时具有GetXXX()和{ {1}}(特别是当ReleaseXXX()的结果方便地属于GetXXX()所采用的类型时) - 然后当您忘记为每个ReleaseXXX()致电ReleaseXXX()时}调用,你会泄漏GetXXX()

答案 2 :(得分:0)

以下是我使用CString::GetBuffer()CString::ReleaseBuffer()

的示例
LPTSTR pUnitBuffer = pAPBElement->m_strUnits.GetBuffer(APB_UNIT_SIZE);
if (pUnitBuffer != "")
{
   if (strncmp(pAPBElement->m_strUnits, (char*)pszBuffer[nLoop - nFirst], APB_UNIT_SIZE) != 0)
   {    
     LPTSTR pUnitOriginal = pAPBElement->m_strOriginal.GetBuffer(APB_UNIT_SIZE);

     strncpy(pUnitBuffer, 
            (char*)&pszBuffer[nLoop - nFirst], 
            APB_UNIT_SIZE);

     strncpy(pUnitOriginal, 
            (char*)&pszBuffer[nLoop - nFirst], 
            APB_UNIT_SIZE);

     pAPBElement->m_strOriginal.ReleaseBuffer();
    }
}
pAPBElement->m_strUnits.ReleaseBuffer();

答案 3 :(得分:0)

如果您不使用通过GetBuffer()获得的指针来修改CString的内容,则此后无需调用ReleaseBuffer()