CString에 관한 문의

sosuri78의 이미지

MFC 에서 정의하고 있는 CString 관련해서 몇가지 의문이 있어서 질문 드립니다.

1. CStinrg to char

(가)

      char *CStirngtoChar(CString &str)
      {
          char *buf;
          buf = new char[str.GetBufferLength()+1];
          memcpy(buf, str.GetBuffer(0), str.GetBufferLength() + 1);
          str.ReleaseBuffer();
          return buf;
      }
 
      char *buf;
      CString str("FFFF");
      buf = CStringtoChar(str);
      printf("buf %s\n", buf);
      delete buf;

의문 : GetBuffer(0)가 str이 내용을 복사해서 별도의 메모리를 할당하는지 아니면 현재의 메모리 주소만 리턴하는지요?
그에 따라 ReleaseBuffer()를 호출해 줘야 하나요? 만일 하지 않는다면 메모리 누수가 일어나나요?

(나) 다른 예

      char *CStirngtoChar(CString &str)
      {
          return (LPSTR)(LPCSTR)str;
      }

CString 객체의 경우 내부 멤버 변수 m_pchData 가 실제 데이터를 가르키고 있다고 하는데, 위 변환에서 typecasting 을 사용하는데 어떻게 CString str이 char *로 변환 되는지요?

(다) 다른 예

      char *CStringtoChar (CString &str)
      {
          return str.GetBuffer(0);
      }

이때는 호출한 쪽에서 ReleaseBuffer()를 호출해 줘야 하나요?

2. GetBuffer()의 활용

   CString str;
   memcpy(str.GetBuffer(10), "555");
   str.ReleaseBuffer();
   printf("str length %d\n", str.GetBufferLength()); 

만일 위에 GetBuffer(10)이 10개의 버퍼를 할당해서 리턴한다면 ReleaseBuffer()호출 후에는 "555"값이 어떻게 할당이 되는지요? 만일 ReleaseBuffer()호출전에 GetBufferLength()를 호출한다면?

3. BSTR type

   BSTR *bstr
   bstr = CString.AllocSysString(str);
   /* something do */
   ::SysFreeString(bstr);

BSTR type 이 어떤 형식인가요?
SysFreeString 대신에 delete bstr 혹은 free(bstr) 을 써도 무방한지요?

whitelazy의 이미지

음 동작하는 코드를 보고 궁금해 하시는건지 아니면 책보다가 이런 코드가 나와서 궁금해 하시는건지 잘 모르겠습니다.
1번은
(가)의 경우야 memcpy 함수의 정의를 보시면 해당위치에 포인터가 들어가야하는지 아닌지 알수있을 껍니다.
아니라면 우리의 친구 msdn서 Cstring 맴버함수 확인해보면 되겠네요
(나) 는.. 저도 첨알았군요 ㅋ 타입캐스팅이 아니라고합니다.. 지들이 그러니 맞겠죠..
http://msdn2.microsoft.com/en-us/library/aa300569(VS.60).aspx
(다)는 무슨의민지 모르겠는데 클래스 메모리에서 해제할꺼 아니라면야..

2번은 해보면 결과가 나올듯합니다.
3번은 BSTR이 뭔지 저도 잘 몰라서 네이버를 이용해보시면 관련 글들이 좀 나오네요..
찾기 귀찮으시다면 해보고 에러나면 안되는거고 되면 되는거고.. 식의 방법도 있습니다.

sosuri78의 이미지

코드는 CString 공부하다가 작성해 본것입니다.

2번의 경우에는 초기화 되지 않는 str에서 GetBuffer()를 이용한 직접적인 내부 데이터 접근에 관한건데,
ReleaseBuffer() 호출 전에는 GetBufferLength() 가 0을 리턴합니다. ReleaseBuffer()에서 내부 변수 nDataLength 값을 재 설정 하기 때문이라고 합니다. ^^;
http://msdn2.microsoft.com/en-us/library/awkwbzyc.aspx#_core_modifying_cstring_contents_directly

1번의 (가)
경우에는 GetBuffer(0) 후에 ReleaseBuffer()를 해줘야 하는지 여전히 의문이네요.. ReleaseBuffer()를 해주는게 안전할것 같긴한데, 안하면 메모리 누수가 생기는지는 잘 모르겠네요.. ㅠㅠ

3번 BSTR의 경우에는 괜히 쓸데없이 delete나 free를 안쓰기로 했습니다.

kaeri17의 이미지

나 번은 operator overloading을 통한 캐스팅연산자 재정의가 아닐까 생각되네요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.