比如
CString str = L"123";
str.GetBuffer(4);
...
str.ReleaseBuffer();
我想问的是str.ReleaseBuffer();之后 原来的str字符串"123",还有效吗?

解决方案 »

  1.   

    GetBuffer后,可以修改其返回值指向的字符串
    ReleaseBuffer后,其修改保存到对象里
      

  2.   

    CString采用copy-on-write机制(可以实现多个对象共享一块内存),高效而节省内存。GetBuffer函数遇到下面两种情况之一时会创建一个新对象给调用者:
    1、有大于1个的引用时(也就是有多个对象共享内存时);
    2、GetBuffer传递的参数nMinBufLength大于原始字符串长度时。(个人理解这里不太正确,降低了性能。应该是大于原始分配内存的长度时,不知道是不是bug。)GetBuffer返回一个字符串指针,可以像操作 TCHAR* 一样操作,并立即反映到CString对象中。ReleaseBuffer可以理解为重新设置CString的字符串长度。(当然ReleaseBuffer也考虑到了多个对象共享的情况,它不会设置其共享对象的长度。最好不要在TCHAR* p = GetBuffer之后再引用该对象,此时p指向了所有共享对象的字符串内存。)ReleaseBuffer做了两个动作:
    1、多个对象共享时,启用copy-on-write机制,新建一个对象。
    2、重新设置CString的长度。所以,如果没有共享,并且不需要重新设置长度,完全可以不调用ReleaseBuffer。
      

  3.   

    看下面一段代码:     CString str0 = "abcdefghijklmnopqrstuvwxyz";
        CString str1 = str0;
        char* p = str0.GetBuffer(0);
        CString str2 = str0;
        p[0] = '1';
        p[1] = '2';
        p[2] = '3';
        p[3] = '4';
        p[4] = '5';
        str0.ReleaseBuffer(5);执行完之后的结果:
    str0 {"12345"}
    str1 {"abcdefghijklmnopqrstuvwxyz"}
    str2 {"12345fghijklmnopqrstuvwxyz"}