2016-11-16 2 views
2

私は現在MFCライブラリを勉強していますが、そのオブジェクトの文字を読み込んで変更することを可能にする他のメンバ関数よりもCStringオブジェクトバッファへのポインタを返すGetBufferメンバを使うべきですか?例えば なぜ私は(コードはCStringオブジェクトの最初の文字を変更します)実行する必要があります。私はGetBuffer()メンバを使用するためのより適切なアプリケーションがあるとしSetAtの代わりにCStringのGetBufferメンバを使用するのはなぜですか?

CString aStr(_T("String")); //new CString object 
aStr.SetAt(0, _T('a')); //set character at 0 position to 'a' 

、しかし:

CString aString(_T("String")); //new CString object 
LPTSTR p = aString.GetBuffer(); //create new pointer to aString buffer 
_tcsncpy(p, LPCTSTR(_T("a")), 1); //set first character to 'a' 
aString.ReleaseBuffer(); //free allocated memory 

の代わりに私はそれが何であるか把握することができません...この関数は、メモリを解放するためにReleaseBuffer()を必要とし、ReleaseBuffer()が呼び出されないときにメモリリークを引き起こす可能性があります。それを使用する利点はありますか?

答えて

2

上記の例では、SetAtメソッドを使用することが望ましいです。

主にWinAPI関数で使用する場合は、バッファに直接アクセスするためにGetBufferが必要な場合があります。たとえば、WinAPIのコードで::GetWindowTextを使用するには、次のようにバッファを割り当てる必要があります。

int len = ::GetWindowTextLength(m_hWnd) + 1; 
char *buf = new char[len]; 
::GetWindowText(m_hWnd, buf, len); 
... 
delete[] buf; 

同じことをCWnd::GetWindowText(CString&)とMFCで行うことができます。しかし、MFCは、GetBufferを介して、同じ基本WinAPI関数を使用しなければなりません。 CWnd::GetWindowTextのMFCの実装は、概ね次の通りである:あなた他に方法がない場合を除き

void CWnd::GetWindowText(CString &str) 
{ 
    int nLen = ::GetWindowTextLength(m_hWnd); 
    ::GetWindowText(m_hWnd, str.GetBufferSetLength(nLen), nLen+1); 
    str.ReleaseBuffer(); 
} 
1

GetBufferを使用しないでください。正確には、(1)あなたが既に知っている理由のために、あなたが行うことを忘れる可能性のあるReleaseBufferで続かなければならず、リソースリークにつながるからです。そして、(2)不注意に元のデータに変更を加えて、それが何らかの形で矛盾してしまうかもしれません。多くの場合、関数GetString、SetString、GetAt、SetAtは必要な処理を行い、不都合はありません。それらを好む。

関連する問題