`
fiona1011
  • 浏览: 58328 次
  • 性别: Icon_minigender_2
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

关于CString::ReleaseBuffer

MFC 
阅读更多
CString::ReleaseBuffer只是一个形象的说法,完全是跟GetBuffer对应而起的名字。我觉得如果函数名改为UpdateBuffer的就不会出现这种误解    先来看一段代码:    CString s="hello";   
LPTSTR ps=s.GetBuffer();
strcpy(ps,"hi");    
s.ReleaseBuffer();
此时调用s.GetLength()获取的值是2,正确无误。但如果注释掉s.ReleaseBuffer()这一行,s.GetLength()获取的值则是5,哈哈,错了。怎么会这样呢,我们来看看MFC中ReleaseBuffer的代码:    
void ReleaseBuffer( int nNewLength = -1 )
     {
         if( nNewLength == -1 )
         {
             nNewLength = StringLength( m_pszData );
         }
          SetLength( nNewLength );
     }   
很明显ReleaseBuffer只有一个作用,就是更新字符串的长度。CString内,GetLength获取字符串长度并不是动态计算的,而是在赋 值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了 ReleaseBuffer。   
其实,计算长度还能用strlen(),这个就算不ReleaseBuffer也不会出错,但如果不ReleaseBuffer,在+=这种赋值时字符串很可能会跟想要得到的不同。
我得到的教训是:使用了GetBuffer(),但是没有调用ReleaseBuffer,导致字符串内容不能追加。
分享到:
评论

相关推荐

    CString使用方法~

    str.ReleaseBuffer(); // 释放缓冲区,确保修改生效 ``` 以上介绍了`CString`类的一些常用方法,这些方法覆盖了字符串处理的大部分需求,对于使用MFC进行Windows应用程序开发的程序员来说,熟练掌握`CString`的使用...

    CString char string format

    - `GetBuffer`方法用于获取`CString`内部的缓冲区,如果使用了`GetBuffer`,那么必须调用`ReleaseBuffer`方法来释放缓冲区。 - 如果不释放缓冲区,可能会导致内存泄漏。 3. **关于字符串转换中的异常处理** - ...

    CString用法

    以上就是关于`CString`类下常用方法的详细介绍,通过这些方法可以有效地处理字符串相关的各种任务,从而简化程序设计过程中的复杂性。在实际开发中,合理利用这些方法能够显著提高代码的效率和可读性。

    CString的用法

    #### 九、CString::ReleaseBuffer() `void ReleaseBuffer(int nNewLength = -1);` 释放由`GetBuffer()`分配的缓冲区,并可选择性地调整`CString`对象的大小。如果`nNewLength`为负数或未指定,则使用当前字符串的...

    CString工作原理和常见问题分析

    ### CString工作原理详解 #### 一、概述 `CString`是Microsoft Foundation Classes (MFC)框架中的一个核心组件,主要用于处理字符串数据。相比于C语言中的传统字符串处理方式,`CString`提供了一种更加安全和高效...

    VC类型转换文档(总结版本)

    - 当使用`CString`的`GetBuffer`方法后,记得调用`ReleaseBuffer`来释放内存资源。 - 在使用`CString::Format`等方法时,确保格式字符串正确,避免运行时错误。 通过上述介绍,我们可以看到在VC C++中处理各种数据...

    mfc关于CString的所有操作

    在Microsoft Foundation Classes (MFC)库中,`CString`是一个非常重要的类,它提供了一种方便的方式来处理和操作字符串。`CString`类是基于C++的,它在内存管理、字符串连接、格式化等方面提供了很多便利的方法。...

    CString 操作指南 CString 是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。

    `记得调用`ReleaseBuffer()`来结束访问。 - 和控件接口交互:如传递给控制台或其他需要char*的地方。 5. CString与BSTR的转换 - CString转BSTR:使用`SysAllocString`和`ALTRUSTRING`宏。 - BSTR转CString:使用...

    数据类型转换(VC++VC++)

    - `charpoint=strtest.GetBuffer(strtest.GetLength())`获取指向CString内部缓冲区的指针,但需要记住在使用后调用`ReleaseBuffer()`。 12. int转char*: - `stdlib.h`中的`itoa`函数可完成此转换,例如`itoa(i, ...

    VC中CString的成员函数.pdf

    CString::GetBuffer和ReleaseBuffer函数用于获取和释放字符数组的指针: - LPTSTR p = s.GetBuffer(); 获取CString对象s的字符数组指针。 - s.ReleaseBuffer(); 释放由GetBuffer获得的缓冲区。 11. 查找字符集中的...

    CString操作大全指南

    `,然后使用指针访问,记得调用`ReleaseBuffer`。 4. 与控件的接口 当需要将CString与Windows控件(如编辑框)交互时,可以使用控件的成员函数,如`SetWindowText`: ```cpp CString text = "Some Text"; ...

    C++:CString转换

    - `std::string`到`CString`:可以通过调用`c_str()`或`data()`获取`std::string`的C风格字符串,然后传递给`CString`的构造函数,如`CString cstr(str.c_str());` - `CString`到`std::string`:可以使用`...

    一篇关于CString类型转换的文章

    str.ReleaseBuffer(); // 释放对缓冲区的控制权 ``` #### BSTR 与 CString 的转换 `CString` 还提供了两个方法用于与 COM 组件中常用的 `BSTR` 类型进行转换:`SysAllocString` 和 `SysReAllocString`。这些方法...

    c++常用变量类型的转换

    3. **关于 `ReleaseBuffer` 的使用** - 当使用 `GetBuffer` 获取字符串缓冲区时,记得在使用完毕后调用 `ReleaseBuffer` 来释放缓冲区,否则可能会导致内存泄漏。 通过上述内容的介绍,我们不仅了解了C++中不同...

    c字符转化问题,包含了大量的C、c++语言中的字符转化问题

    - `CString` 转 `string`:通过 `string s(CString.GetBuffer())`,但别忘了 `ReleaseBuffer()` 来释放内存。 - `char*` 或 `char[]` 转 `string`:直接用 `string s(char *)` 初始化,或者使用 `string::assign` ...

    MFC各种数据类型转换

    需要注意的是,在CString转string时,需要使用GetBuffer()函数获取CString的缓冲区,然后将其转换为string,但是在使用GetBuffer()函数时,需要调用ReleaseBuffer()函数来释放缓冲区所占的空间。 CString与char*...

    VC中format用法

    * CString 转 string:使用 CString.GetBuffer() 函数将 CString 转换为 string,但需要使用 ReleaseBuffer() 释放缓冲区所占的空间。 * CString 转 char*:使用 CString.GetBuffer() 函数将 CString 转换为 char*,...

    CString操作指南

    cstr.ReleaseBuffer(); ``` - 通过控件接口,如发送`LB_GETTEXT`消息到列表框控件。 4. **BSTR与CString的转换** - **BSTR到CString**:使用`SysAllocString()`和`_tcscpy()`。 - **CString到BSTR**:使用`_...

Global site tag (gtag.js) - Google Analytics