观察任务管理器 getbuffer时有申请了内存,但是ReleaseBuffer时没有释放掉
#include "stdafx.h"
#include "afx.h"
int main(int argc, char* argv[])
{
CString tmp = "test\n";
for(int i=0;i<100;i++)
{
printf(tmp.GetBuffer(0));
tmp.ReleaseBuffer();
}
return 0;
}

解决方案 »

  1.   

    getbuffer时有申请了内存?还没听说过
      

  2.   

     GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。
    其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在 CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者 malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
      

  3.   

    ReleaseBuffer函数是用来告诉CString对象,你的 GetBuffer所引用的内存已经使用完毕,现在必须对它进行封口,否则CString将不会知道它现在所包含的字符串的长度,所以在使用完 GetBuffer之后,必须立即调用ReleaseBuffer函数重置CString的内部属性,其实也就是头部信息。
    说白了  ReleaseBuffer就是更新赋值之后的字符串的长度, 而实际空间没有根本的变化。
      

  4.   

    ReleaseBuffer的作用中止GetBuffer所得到的内存的直接引用,并不代表释放内存,内存在CString析构时释放。MSDN:
    Use ReleaseBuffer to end use of a buffer allocated by GetBuffer....he address returned by GetBuffer is invalid after the call to ReleaseBuffer or any other CString operation.
      

  5.   

    那么为什么看到getbuffer所涨的内存,在函数结束后 没有被析构掉啊
      

  6.   


    不过我想知道什么会调用cstring的析构函数啊,局部变量是不是函数结束就会啊,那么我看任务管理器,内存没降下来