한가지 예를 들어 봅시다.
typedef struct
{
int i;
int j;
} A;
A foo()
{
A a = {};
return a;
}
//---------------------------------------------------------------------------
__fastcall TForm::TForm(TComponent* Owner)
: TForm(Owner)
{
A * a = &foo();
}
위와 같이 foo() 에서 A를 리턴할 때, A가 스택변수 이기 때문에 foo() 함수의 리턴과 함께
로컬스코프 이기 때문에 A는 소멸 됩니다. 그래서 소멸된 A를 사용하는 결과가 되지만
foo() 함수가 다음과 같다면
A foo()
{
static A a = {};
return a;
}
A는 static 타입이기 때문에, foo() 에서 로컬스코프를 벗어나더라도 소멸되지 않고 존재하게 됩니다.
문법적으로
A * a = &foo();
와 같은 표현은 전혀 문제가 없는 겁니다.
빌더의 64비트 C++ 컴파일러가 파싱의 오류를 범하고 있는 거죠.
VC, GCC, Intel C++ 컴파일러 같은 다른 컴파일러들은 저걸 오류로 파싱하지 않습니다.
김태선 님이 쓰신 글 :
: XE3가 없어서 64비트에서 테스트는 못하지만,
:
: 그냥 상식적으로 보면
: &Rect(0, 0, 0, 0);
: 에서 리턴되는 TRect 객체는 스택에 생성됩니다.
: 이 스택에 생성된 객체의 번지를 얻어서
: rc 값을 지정했기 때문에
: 함수 리턴등의 이유로 스택이 파괴되면 당연히 오류를 일으키는 코드가 됩니다.
:
:
:
: 윈도우즈64 님이 쓰신 글 :
: : TRect* rc = &Rect(0, 0, 0, 0);
: :
: : 요런 작업 실행 시 에러가 나는데 왜그럴까요? 빌더 xe3사용중입니다.
|