C 之GetBuffer函式詳解

2021-12-30 00:28:59 字數 1674 閱讀 9713

這個函式是為乙個cstring物件重新獲取其內部字元緩衝區的指標,返回的lptstr為非const的,從而允許直接修改cstring中的內容! 如果nminbuflength 比當前buffer大,那麼就呼叫releasebuffer函式去釋放當前的buffer,用乙個被請求的大小去覆蓋這個buffer重新設定計數器為 0,如果在這之前你在這個buffer中呼叫了lockbuffer,那麼你將失去你當前鎖定的buffer

如果你使用這個指向由getbuffer所改變返回的字串內容,那麼在你使用cstring其他cstring方法之前你必須呼叫releasebuffer。在呼叫releasebuffer函式之後getbuffer中的內容將無效(也就是銷毀)

當這個cstring被銷毀的時候,這個buffer所占用的記憶體將被自動釋放

注意: 如果你知道了這個字串的長度,你不可以直接新增null字元了事,當你使用releasebuffer的時候你必須指定最後的字串長度,如果你僅僅新增了乙個null字元結束符給這個字串,你應該給releasebuffer傳遞乙個-1 當這個函式結束的時候_tcslen 將決定這個buffer的長度

例子:// example for cstring::getbuffer

cstring s( "abcd" );//定義乙個cstring s並且初始化為abcd

#ifdef _debug

afxdump << "cstring s " << s << " ";

#endif

lptstr p = s.getbuffer( 10 );//定義乙個指標指向lptstr並接受getbuffer所返回的位址

lstrcpy( p, _t("hello") ); // directly access cstring buffer//使用istrcpy將hello]複製到該buffer中

s.releasebuffer( );//釋放buffer

#ifdef _debug

afxdump << "cstring s " << s << " ";這時候s="hello";

#endif

這是乙個非常容易被用錯的函式,主要可能是由於大家對它的功能不太了解。其實點破的話,也不是那麼深奧。

getbuffer(int size)是用來返回乙個你所指定的大小並可寫記憶體的函式。它和被過載的操作符lpctstr還是有點本質區別的,lpctstr是直接返回乙個唯讀記憶體的指標,而getbuffer則是返回乙個可以供呼叫者寫入的記憶體,並且,你可以給定大小。下面是個簡單的,但也是非常典型的例子:

int readfile(cstring& str, const cstring& strpathname)

上面的函式是getbuffer函式最典型的用法了,其實它就相當於申請一塊nlen大小的記憶體,只不過,這塊記憶體是被引用在cstring物件的內部而已,這是非常有效的一種用法,如果不直接用getbuffer函式來申請的話,那麼你必須用new操作符(或者malloc()函式)在 cstring的外部申請,然後再將申請的記憶體拷貝到cstring物件中,顯然這是乙個非常冗餘的操作,會使你函式的效率大大下降。

releasebuffer函式是用來告訴cstring物件,你的getbuffer所引用的記憶體已經使用完畢,現在必須對它進行封口,否則 cstring將不會知道它現在所包含的字串的長度,所以在使用完getbuffer之後,必須立即呼叫releasebuffer函式重置 cstring的內部屬性,其實也就是頭部資訊。

GetBuffer 函式的使用

如果你需要修改cstring中的內容,它有乙個特殊的方法可以使用,那就是getbuffer,它的作用是返回乙個可寫的緩衝指標。如果你打算修改字元或者截短字串,你完全可以這樣做 cstring s t file.ext lptstr p s.getbuffer lptstr dot strchr p,...

c 之建構函式詳解C 建構函式的理解

相對於c語言來說,c 有乙個比較好的特性就是建構函式,即類通過乙個或者幾個特殊的成員函式來控制其物件的初始化過程。建構函式的任務,就是初始化物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。建構函式的名字必須和類名相同,與其他函式不一樣的是,建構函式沒有返回值,而且其必須是公有成員,因為...

C 之虛函式(一)純虛函式詳解

有時在基類中將某一成員函式定為虛函式,並不是基類本身的要求,而是考慮到派生類的需要,在基類中預留了乙個函式名,具體功能留給派生類根據需要去定義。例如在前邊的例12.1 詳情請檢視 什麼是c 虛函式 程式中,基類point中沒有求面積的area函式,因為 點 是沒有面積的,也就是說,基類本身不需要這個...