对于当前要处理的某字符,如果你在调用 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的计算。
同时,暴露在外面的指针已经不可用了。
好在只发了三个帖子,楼主提高结帖率才是正道。
其实,你看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 )该用怎样的参数?这个,特别不明白。
此外,ReleaseBuffer( int nNewLength = -1 )该用怎样的参数?这个,特别不明白。
#6
http://topic.csdn.net/t/20030324/21/1571461.html
楼主看看这里,可能对你有帮助
楼主看看这里,可能对你有帮助
#7
好吧,看了6楼介绍的帖子,看了下面的代码,我基本算明白了。那个参数就是留下的字串的长度,应该是这么理解。
lstrcpy(pStr, "1234567890");
str.ReleaseBuffer(5); //释放缓冲到指定的字符串长度
现在的字符串是"12345"
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的计算。
同时,暴露在外面的指针已经不可用了。
好在只发了三个帖子,楼主提高结帖率才是正道。
其实,你看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 )该用怎样的参数?这个,特别不明白。
此外,ReleaseBuffer( int nNewLength = -1 )该用怎样的参数?这个,特别不明白。
#6
http://topic.csdn.net/t/20030324/21/1571461.html
楼主看看这里,可能对你有帮助
楼主看看这里,可能对你有帮助
#7
好吧,看了6楼介绍的帖子,看了下面的代码,我基本算明白了。那个参数就是留下的字串的长度,应该是这么理解。
lstrcpy(pStr, "1234567890");
str.ReleaseBuffer(5); //释放缓冲到指定的字符串长度
现在的字符串是"12345"
lstrcpy(pStr, "1234567890");
str.ReleaseBuffer(5); //释放缓冲到指定的字符串长度
现在的字符串是"12345"