hur.cn - 华软网

 热门搜索

CString::ReleaseBuffer()问题

  作者:未知    来源:网络    更新时间:2011/8/11
比如
CString str = L"123";
str.GetBuffer(4);
...
str.ReleaseBuffer();


我想问的是str.ReleaseBuffer();之后 原来的str字符串"123",还有效吗?
---华软 网友回答---
GetBuffer后,可以修改其返回值指向的字符串
ReleaseBuffer后,其修改保存到对象里

---华软网友回复---
有效
引用楼主 wuxiao1983 的回复:
比如
CString str = L"123";
str.GetBuffer(4);
...
str.ReleaseBuffer();


我想问的是str.ReleaseBuffer();之后 原来的str字符串"123",还有效吗?

---华软网友回复---
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。

---华软网友回复---
看下面一段代码

     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"}
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。