C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[62788] Re:코드가드 쓰면 t_str()변환이 안됩니다..
아제나 [azena] 1586 읽음    2010-10-26 17:05
임시 객체 소멸 관련 문제입니다.
빌더 쓸 때 가장 유의해야 할 점이죠.
객체->Caption 은 프로퍼티 입니다.
즉, Caption은 객체가 아니라 함수죠.
리턴값을 받아서 쓰는 것인데, 리턴값은 함수 내부에서 선언된 임시 객체이다보니 자동으로 소멸이 됩니다.
코드가드를 꺼두면, 함수 종료한 후에 별다른 작업을 안 하기 때문에
임시 객체가 해제되어도 값이 그대로 유지가 되면서 정상값을 출력하지만,
코드가드는 보이지 않는 코드를 마구 삽입합니다.
메모리가 제대로 정상적으로 할당되었는지 해제는 잘 되었는지 체크하는 코드들이죠 -_-
그러다보니 임시 객체는 이미 안드로메다로 가버리고,
쓰레기값이 화면에 출력되는 것이예요.
그래서 c_str(), t_str(), w_str() 쓰실 때는 매우 주의해서 쓰셔야 합니다.
로컬 객체를 만들어서 쓰시는 것을 권장합니다.

UnicodeString tmpObj;
tmpObj = lpItem->Caption;
...
tmpObj.t_str();
...

습관되면 오히려 이게 더 편합니다.



용맨소녀 님이 쓰신 글 :
: printf("1 - %s, %s\n", ((AnsiString)lpItem->Caption).c_str(), ((AnsiString)Edit_Label->Text).c_str());
: printf("2 - %s, %s\n", lpItem->Caption.t_str(), Edit_Label->Text.t_str());
:
: 코드가드를 끄면 위의 결과물이 동일하게 출력됩니다..
:
: 코드가드를 켜면 2번이 깨져서 나옵니다..
:
: 왜 그럴까요?

+ -

관련 글 리스트
62759 코드가드 쓰면 t_str()변환이 안됩니다.. 용맨소녀 1030 2010/10/24
62788     Re:코드가드 쓰면 t_str()변환이 안됩니다.. 아제나 1586 2010/10/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.