|
초보 님이 쓰신 글 :
: 한 클래스에서
:
: public :
: static wchar_t *aa;
:
: 초기화는 null로 시켰구요.
:
: static함수에서 WideString *text 를 인수로 받아서 저 변수에 넣을려고 합니다.
: aa = text->c_bstr;
:
: 했는데.. 결과가 이상합니다. -_-;
: 그런데 그 함수내에서 새로 변수를 생성해서 대입하면 똑바로 됩니다.
: wchar_t *bb = text->c_bstr;
:
: string을 갖고 오려고 하는데요. bb는 똑바로 되고, aa는 왜 안되는것입니까??
: 너무 궁금합니다.
: 어떻게 해야하나요. 이 차이가 어떻게 된것인지 설명을 좀 부탁드립니다.
: 감사합니다. 꾸벅~
class TStaticTest
{
public:
static wchar_t *aa;
static void SetStr(const WideString& wstr)
{
aa = wstr.c_bstr();
}
};
wchar_t *TStaticTest::aa=0;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString wstr("클래스 정적변수 시험");
// TStaticTest::aa = wstr.c_bstr();
TStaticTest::SetStr(wstr);
AnsiString astr(TStaticTest::aa);
TStaticTest stc1;
stc1.aa = wstr.c_bstr();
AnsiString astr2(stc1.aa);
TStaticTest stc2;
stc2.aa = wstr.c_bstr();
AnsiString astr3(stc2.aa);
AnsiString msg;
msg.printf("TStaticTest::aa:%Xh(%s)\r\nstc1.aa:%Xh(%s)\r\nstc2.aa:%Xh(%s)"
,TStaticTest::aa,astr
,stc1.aa,astr2
,stc2.aa,astr3);
ShowMessage(msg);
}
참고로,
클래스의 정적멤버는 '클래스이름::멤버이름' 과 같은 형식으로 액세스하는 것이 좋습니다.
인스턴스를 통해 접근할 수도 있지만 이렇게 하는 것이 알기 쉽습니다.
마지막으로,
한가지 주의할 것은 WideString::c_bstr()과 AnsiString::c_str() 함수가 반환하는 포인터는 안전하지 않다는 것입니다.
해당 WideString/AnsiStirng 인스턴스의 문자열의 길이가 더 커지는 경우 내부 버퍼를 재할당해야 하는 경우가 발생할 수 있는데 재할당하게 되면 그 이전에 c_bstr()/c_str()로 구한 포인터들은 더 이상 유효한 버퍼를 가리키지 않게 될 가능성이 있습니다.
|