CString之GetBuffer与ReleaseBuffer

  我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能。

  GetBuffer()主要作用是将字符串的缓冲区长度锁定;

  ReleaseBuffer()则是解除对缓冲区的锁定,这样使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。

  

  GetBuffer()说白了就两个功能:

  1:就是将CString里面的内存交到外部一个来处理,外部可以直接修改它的内容。

  2:重新修改CString的内存大小,这个数值不包含null结尾符。

  另一个典型的用法:就是将CString里面的内容变为int或long型,需要先获取里面的内存指针。这样就可以先GetBuffer(内存大小)方便直接转换。

  如果在外部修改了CString里面的内容,在重新使用CString之前,需调用ReleaseBuffer()也就是说,ReleaseBuffer()不需要每次都调用。

 

  CString::GetBuffer有两个重载版本:

  LPTSTR GetBuffer( );

  LPTSTR GetBuffer(int nMinBufferLength);

  在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。

  而调用第一个版本时,应如通过传入0来调用第二个版本一样。

 

  是否需要在GetBufer()后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。

  如果你GetBuffer()以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer()没什么意义了。


     GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的操作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。

  下面是个简单的,但也是非常典型的例子:

 1 int readFile(CString& str, const CString& strPathName)
 2 {
 3       FILE* fp = fopen(strPathName, "r");
 4       fseek(fp, 0, SEEK_END);
 5       int nLen = ftell(fp); 
 6       fseek(fp, 0, SEEK_SET); 
 7       char* psz = str.GetBuffer(nLen);
 8       fread(psz, sizeof(char), nLen, fp); 
 9       str.ReleaseBuffer();
10       fclose(fp);
11 }

  上面的函数是GetBuffer()函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
  ReleaseBuffer()函数是用来告诉CString对象,你的GetBuffer()所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer()之后,必须立即调用ReleaseBuffer()函数重置CString的内部属性,其实也就是头部信息。

转载于:https://www.cnblogs.com/MakeView660/p/6046612.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 编译android系统,mac 编译 Android 系统杂记

挂载android分区sudo hdiutil attach ~/android_code/android7.dmg.sparseimage -mountpoint /Volumes/android原放入U盘:echo 188jinghao | sudo -S hdiutil attach ~/android7.dmg.sparseimage -mountpoint /Volumes/android放入机械硬盘sudo hdiutil attach /Vol…

Java开发必须熟悉的Linux命令总结

身为一个Java开发人员,这些常用的Linux命令必须掌握。即使平时开发过程中没有使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。所以,要和服务器机器交互,就要通过she…

构析函数

析构函数:__del__() 释放对象时自动调用 class Person(object):def run(self):print("run")def eat(self,food):print("eat"food)def __init__(self,name,age,height,weight):self.name nameself.height heightself.age ageself.weight …

Java 序列化Serializable详解(附详细例子)

Java 序列化Serializable详解(附详细例子) 1、什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。 2、什么情况下需要…

kettle-实现每个分组的前N的数据

2019独角兽企业重金招聘Python工程师标准>>> 第一步:创建表及数据: create table uid(uid int, --uidcate varchar(20), --类别price double --金额 ) insert into uid values(123,c1,21); insert into uid values(123,c2,23); insert into u…

重写__repr__与__str__函数

重写:将函数重新定义写一遍__str__():再调用print 打印对象时自动调用,是给用户用的是一个描述对象的方法__repr__():是给机器用的,在python解释器里面直接敲对象名再回车调用的方法注意:在没有str时,且有repr,str re…

linux nexus 使用问题

2019独角兽企业重金招聘Python工程师标准>>> 问题一,启动提示设置RUN_AS_USERroot 但是,设置export或 /etc/profile未生效。 **************************************** WARNING - NOT RECOMMENDED TO RUN AS ROOT *************************…

项目回顾-PopupWindow

右上菜单,可以通过 重写 onCreateOptionsMenu指定 menu, 重写 onOptionsItemSelected 来响应点击事件 不过 这个菜单在某些手机上弹出的有点卡顿,而且如果不对主题进行设置,会从actionbar 上直接弹出,而不是下面 如果想…

android listpreference 自定义,Android ListPreference的用法一

xmlns:android"http://schemas.android.com/apk/res/android"android:key"screen_list"android:title"标题"android:summary"说明摘要">< ListPreferenceandroid:key"myListPreference"android:title"标题"…

C语言求最大公约数和最小公倍数的几种算法

求最小公倍数算法&#xff1a; 最小公倍数两整数的乘积最大公约数 求最大公约数算法&#xff1a; (1)辗转相除法 有两整数a和b&#xff1a; ① a%b得余数c ② 若c0&#xff0c;则b即为两数的最大公约数 ③ 若c≠0&#xff0c;则ab&#xff0c;bc&#xff0c;再回去执行①…

3月15日云栖精选夜读:双管齐下,MaxCompute数据上云与生态

双管齐下&#xff0c;MaxCompute数据上云与生态 作者&#xff1a;场景研读 Go语言并发机制初探 作者&#xff1a;邴越 趣拍云短视频SDK全面升级&#xff0c;简单易用引开发者点赞 作者&#xff1a;sherry是雪梨 发表在&#xff1a;趣拍云团队 阿里云机器学习平台编程模型演…

qt android glsl,基于Qt的OpenGL学习(1)—— Hello Triangle

简介要学习OpenGL的话&#xff0c;强烈安利这个教程JoeyDeVries的learnopengl&#xff0c;这里是中文翻译好的版本。教程中使用OpenGL是通过GLFW这个库&#xff0c;而在Qt中对OpenGL封装得很好&#xff0c;并且和GUI以及IO相关的处理Qt更便捷&#xff0c;学习起来更轻松。这里就…

解决:Not Found: /favicon.ico

直接说解决办法&#xff1a; &#xff08;1&#xff09;制作一个 favicon.ico图标放在<head></head>标签中 <link rel"shortcut icon" href"xxxxxxxxxx.ico" type"image/x-icon" /> <!--制作的图标&#xff0c;使用hr…

多态方法调用的解析和分派

方法调用并不等同于方法执行&#xff0c;方法调用阶段唯一的任务就是确定被调用方法的版本&#xff08;即调用哪一个方法&#xff09;&#xff0c;暂时还不涉及方法内部的具体运行过程。在程序运行时&#xff0c;进行方法调用是最普遍、最频繁的操作&#xff0c;Class文件的编译…

ES6:Set和Map

Set Set:类似数组&#xff0c;但是成员的值都是唯一的&#xff0c;没有重复。Set本身是一个构造函数&#xff0c;用来生成Set数据结构。他包含的方法&#xff1a;add: 添加某个值&#xff0c;返回Set结构本身。delete: 删除某个值&#xff0c;返回一个布尔值&#xff0c;表示是…

九九乘法表[循环嵌套]

#九九乘法表 # 1*11 # 1*22 2*24 # 1*33 2*36 3*39 # ...#循环嵌套 #行数 i 1 while i < 9:# 打印每行的内容j 1while j < i:print("%d * %d %3d " % (i, j, i * j), end)j 1print() # 换行i 1while嵌套&#xff1a;w 1 while w < 10: #外层循…

关于用VS写C程序运行时出现烫字以及乱码的问题的原因

最近在复习C语言写程序时&#xff0c;突然碰到标题上的这种情况&#xff0c;后来经过上网查找以及逐步调试才发现原来是在打印数组的时候“越界”导致的&#xff0c;因为程序在默认初始化char类型的数组时&#xff0c;初始化的值是“烫”字&#xff0c;一般情况下是字符串未初始…

javascript函数调用的各种方法!!

在JavaScript中一共有下面4种调用方式&#xff1a; (1) 基本函数调用 (2)方法调用 (3)构造器调用 (4)通过call()和apply()进行调用 1. 基本函数调用 普通函数调用模式&#xff0c;如&#xff1a; JavaScript code?1234function fn(o){…… }fn({x:1});在基本函数调用中&#x…

ARM TK1 安装kinect驱动

首先安装usb库 $ git clone https://github.com/libusb/libusb.git 编译libusb需要的工具 $ sudo apt-get install autoconf autogen $ sudo apt-get install libtool $ sudo apt-get install libudev* 编译安装 $ sudo ./autogen.sh $ sudo make $ sudo make install $ sudo l…

如何在一个html页面中提交两个post,如何在同一个页面上从Django和Ajax获得多个post请求?...

我一整天都在为这事犯愁。似乎什么都没用。这是我的情况。在我有一个Django表单&#xff0c;有两个字段&#xff1a;redirect_from&#xff0c;redirect_to。此表单有两个提交按钮&#xff1a;Validate和{}。当页面加载时&#xff0c;Submit被隐藏&#xff0c;只显示Validate。…