CString::ReleaseBuffer()问题 比如CString str = L"123";str.GetBuffer(4);...str.ReleaseBuffer();我想问的是str.ReleaseBuffer();之后 原来的str字符串"123",还有效吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 GetBuffer后,可以修改其返回值指向的字符串ReleaseBuffer后,其修改保存到对象里 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"} 关于com hook的问题......虚函数表不是共用的吗? ezusb.sys 在Win2000的机子上不能安装 为什么《windows程序设计》一书中的菜单项的内容改写成中文就变成了乱码? TransparentBlt函数怎么这么猛啊?!CUP占用狂飙!! 对一些库函数的提问 完成端口模型中,如果判断一个clientsocket是否关闭了? C的多线程范例运行不起来 怎样获得完整的窗口背景图 调试中的一个令人不解的问题 :INTERNAL COMPILER ERROR 哪里介绍钩子的文章或书下载 用VS2008安装项目如何生成文件和写入文件? 读出现有的XML文件,向根节点添加节点出错
ReleaseBuffer后,其修改保存到对象里
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 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"}