最近编程序时要获得当前路径,定义了一个CString对象currPath,使用了GetBuffer方法来获得当前路径:
GetCurrentDirectory(MAX_PATH,currPath.GetBuffer(MAX_PATH));
然后我想在当前路径下建立一个文件夹a,即在currPath后增加路径“/a”,使用+运算符:
currPath+="/a";
结果调试时发现currPath的值在运算后变成了“/a”。改变了很多种方法进行相加都没有解决这个问题。后来上网查了一下,发现了问题的所在:
getbuffer是为了让你使用CString类中,保存字符串]缓冲区的那块指针。至于releasebuffer,在MSDN中有这样一句话:If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
在对GetBuffer返回的指针使用之后需要调用ReleaseBuffer,这样才能使用其他Cstring的operations。否则会发生错误。
了解到这一问题后,我在GetCurrentDirectory语句后面增加了currPath.ReleaseBuffer();再运行没有问题了。
关于GetBuffer/ReleaseBuffer,网上比较流行的一种说法是:如果你要直接修改CString的内部数据,就要调用GetBuffer/ ReleaseBuffer。当你调用ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象。如果仅仅是读出CString中的内容,那么只需要用GetBuffer(0)即可。如果后面对CString还有其他操作,那么立刻ReleaseBuffer。