|
임시 객체 소멸 관련 문제입니다.
빌더 쓸 때 가장 유의해야 할 점이죠.
객체->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번이 깨져서 나옵니다..
:
: 왜 그럴까요?
|