网上查了CString的用法,有些看不明白,求助。

时间:2021-11-15 22:25:34

对于当前要处理的某字符,如果你在调用 ReleaseBuffer 函数时释放的空间长度比通过调用GetBuffer分配的实际长度小时,

将会造成你程序实际维护的内存比实际需要的内存多,请注意.但这不会造成内存泄漏,因为当CString 对象销毁时,

占用的内存将被释放. 

ReleaseBuffer( int nNewLength = -1 )函数什么时候使用默认参数-1主要决定于: 
 
1.要释放的字符串长度是否大于通过调用GetBuffer分配的实际长度,如果希望释放的长度小于实际长度,那就添写你需要的长度  

2.要释放的字符串长度就是实际长度,且你知道缓冲区中的字符串是以空字符结尾的,则可以省略nNewLength参数.如果不是空字符结尾,则须使用实际长度参数.

===这几句话说的什么意思?“ 释放内存空间”到底释放的是哪里的内存空间?怎么释放?

用这个例子解释下:

CString s;s = "abc"; 

LPTSTR p = s.GetBuffer( 1024 );
 
strcpy(p, "123456789"); 

ASSERT( s.GetLength() == 3 ); 

s.ReleaseBuffer(); // 释放多余的内存,现在p无效。 

ASSERT( s.GetLength() == 9 );

7 个解决方案

#1


怎么释放?
......我也不知道

#2


当然是指针指向的内存了

#3


楼主结帖率太低,这是大家不热情回复的原因: 结帖率:0.00%
好在只发了三个帖子,楼主提高结帖率才是正道。

其实,你看ATL的源码才是最好的解释!
我给你简单说一下。

CString s;
s = "abc";

LPTSTR p = s.GetBuffer( 1024 ); // 这里是先delete []掉原来的buf,再new buf[1024],并返回buf的指针

strcpy(p, "123456789");

ASSERT( s.GetLength() == 3 );

s.ReleaseBuffer(); // 释放多余的内存,现在p无效。
==========
这里将buf的管理交给了CString内部,比如:Length的计算。
同时,暴露在外面的指针已经不可用了。

#4


回复3楼,我是新手,不知道还有结贴这回事,不好意思。

#5


3楼,我主要是不明白,“释放内存空间”到底是什么意思?

此外,ReleaseBuffer( int nNewLength = -1 )该用怎样的参数?这个,特别不明白。

#6


http://topic.csdn.net/t/20030324/21/1571461.html
楼主看看这里,可能对你有帮助

#7


好吧,看了6楼介绍的帖子,看了下面的代码,我基本算明白了。那个参数就是留下的字串的长度,应该是这么理解。

  lstrcpy(pStr,   "1234567890");   
  str.ReleaseBuffer(5);       //释放缓冲到指定的字符串长度   
                  现在的字符串是"12345"   

#1


怎么释放?
......我也不知道

#2


当然是指针指向的内存了

#3


楼主结帖率太低,这是大家不热情回复的原因: 结帖率:0.00%
好在只发了三个帖子,楼主提高结帖率才是正道。

其实,你看ATL的源码才是最好的解释!
我给你简单说一下。

CString s;
s = "abc";

LPTSTR p = s.GetBuffer( 1024 ); // 这里是先delete []掉原来的buf,再new buf[1024],并返回buf的指针

strcpy(p, "123456789");

ASSERT( s.GetLength() == 3 );

s.ReleaseBuffer(); // 释放多余的内存,现在p无效。
==========
这里将buf的管理交给了CString内部,比如:Length的计算。
同时,暴露在外面的指针已经不可用了。

#4


回复3楼,我是新手,不知道还有结贴这回事,不好意思。

#5


3楼,我主要是不明白,“释放内存空间”到底是什么意思?

此外,ReleaseBuffer( int nNewLength = -1 )该用怎样的参数?这个,特别不明白。

#6


http://topic.csdn.net/t/20030324/21/1571461.html
楼主看看这里,可能对你有帮助

#7


好吧,看了6楼介绍的帖子,看了下面的代码,我基本算明白了。那个参数就是留下的字串的长度,应该是这么理解。

  lstrcpy(pStr,   "1234567890");   
  str.ReleaseBuffer(5);       //释放缓冲到指定的字符串长度   
                  现在的字符串是"12345"