본문 바로가기

Programming

GetBuffer 함수에 대하여

CString 함수는 문자열을 동적으로 저장합니다.

그건 CString 에 문자열을 넣을때에 문자열의 길이만큼 메모리를 잡아서 문자열을 복사한다는 의미죠.

그런데 질문하신 구문을 보면 CString 타입을 그냥 LPCSTR 타입으로 바로 케스팅을 하였는데요

여기서 LPCSTR 은 CString 에서 연산자 재정의를 통해서 CString 의 문자열의 첫번째 포인터를 리턴하도록 만든 것입니다.

보시면 사이의 C 문자가 Const 의 의미로 반환한 문자열 포인터에 들은 값을 변경할 수 없도록 한것이죠.

잘 모르시겠으면 C 나 C++ 책에서 Const 의 의미를 찾아보심이...

CString 타입에 문자열을 복사하도록 구현한 함수가 GetBuffer 함수입니다.

위의 구문을 다시 해보면



CString ss;

GetPrivateporfileString("section","key","",ss.GetBuffer(BUF_SIZE), BUF_SIZE), path);

ss.ReleaseBuffer();



이렇게 해주어야 합니다.

BUF_SIZE 는 원하는 크기를 넣으기구요.

GetBuffer 함수는 인자로 받는 크기만큼의 메모리를 잡아서 char 배열처럼 사용하도록 해주는 함수구요

ReleaseBuffer(); 는 복사된 문자열이 차지한 공간외에 남는 공간이 생기게 되니가 그 남는 공간을 해제해 주기위한 함수입니다.

만인 ss.GetBuffer(100) 으로 생성한 100 바이트의 공간에 20 바이트의 문자열을 복사하게되면 80 바이트나 되는 공간이 남게됩니다.

따라서 복사한 후에 ReleaseBuffer(); 함수를 호출하면 복사된 20바이트는 남겨두고 뒤에 필요없이 남은 80바이트를 나려버리는 겁니다.

단, 그냥 보기에는 뒤의 남는 80바이트를 날리는 것 처럼 보이지만 사실 내부적으로는

유효한 공간인 20바이트를 다른 메모리 영역으로 복사하고 GetBuffer() 에서 생성했던 100바이트의 공간을 해제하는 방식입니다.

이건 뭐 heap 메모리를 컨트롤 해 보면 달리 방법이 없다는 생각이 드실겁니다.

하여간 ReleaseBuffer(); 를 하였다고 해서 복사하였던 문자열까지 날아가는 것은 아니니 Buffer 로서 사용한 후에 바로

ReleaseBuffer(); 함수를 호출해주면 됩니다.



위의 구문이 잘 이해가 안가면 아얘 안전하게 C 언어방식으로 풀어서



CString ss;

chat buffer[BUF_SIZE];

GetPrivateporfileString("section","key","",buffer, BUF_SIZE), path);

ss = buffer;



이런식으로 하시던가요


<출처-데브피아>



GetBuffer()

CString형을 char형으로 변환해주는 것입니다.
전달인자는 버퍼최소크기를 지정하는 것이구요.
보통 0을 사용합니다. CString문자열의 크기만큼 지정되는겁니다


CString으로 선언한 변수를 char*로 바꾸는 방법.

또 반대로 char*로 선언된 변수를 CString으로 바꾸는 방법.


 

CString <--> char *  
 
CString -> char *

CString str;
str = "Hello";
char* ss = LPSTR(LPCTSTR(str));


char * --> CString


char ss[] = "Hello";
CString str;
str.Format("%s", ss);

(Format대신에 GetBuffer()를 써도 됩니다.)