문제

저는 Delphi를 처음 사용하고 있으며 기본적으로 어떤 객체 변수와 스택 변수가 초기화되는지 확인하기 위해 일부 테스트를 실행했습니다.

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

이것이 내가 다른 언어에서 익숙한 행동이지만 델파이에 의존하는 것이 안전한 지 궁금합니다. 예를 들어, 컴파일러 설정에 의존 할 수 있는지 또는 다른 기계에서 다르게 작동하는지 궁금합니다. 객체의 기본 초기화 값에 의존하는 것이 정상입니까, 아니면 생성자에서 모든 인스턴스 변수를 명시 적으로 설정합니까?

스택 (프로 시저 레벨) 변수의 경우, 내 테스트는 단위화 된 부울이 사실임을 보여주고, 단위화 된 정수는 2129993264이며, 비 초간화 된 객체는 유효하지 않은 포인터 (즉, NIL이 아님)입니다. 표준이 프로 시저 수준 변수에 액세스하기 전에 항상 설정하는 것이라고 생각합니까?

도움이 되었습니까?

해결책

예, 이것은 문서화 된 행동입니다.

  • 객체 필드는 항상 0, 0.0, '', false, nil 또는 적용되는 모든 것으로 초기화됩니다.

  • 글로벌 변수는 항상 0 등으로 초기화됩니다.

  • 로컬 참조 계산* 변수는 항상 nil 또는 ''로 초기화됩니다.

  • 로컬 비 참조 계산* 변수는 초기화되지 않으므로 사용하기 전에 값을 할당해야합니다.

나는 그것을 기억한다 배리 켈리 어딘가에 "참조 카운트"에 대한 정의를 썼지 만 더 이상 찾을 수 없으므로 그 동안 이렇게해야합니다.

참조 카운트 == 참조 카운트 또는 직간접 적으로 직접 또는 간접적으로 필드 (레코드) 또는 요소 (배열)와 같은 참조 카운트가 포함되어 있습니다. string, variant, interface또는 동적 배열 또는 정적 배열 그러한 유형을 포함합니다.

메모:

  • record 그 자체로는 참조 계산이되기에 충분하지 않습니다
  • 나는 아직 제네릭으로 이것을 시도하지 않았습니다

다른 팁

명시 적 이니셜 라이저가없는 글로벌 변수는 실행 파일의 BSS 섹션에 할당됩니다. 그들은 실제로 exe의 공간을 차지하지 않습니다. BSS 섹션은 OS가 할당되어 0으로 지우는 특수 섹션입니다. 다른 운영 체제에는 유사한 메커니즘이 있습니다.

전역 변수가 제로 시작되는 것에 의존 할 수 있습니다.

클래스 필드는 기본 0입니다. 이것은 당신이 그것에 의존 할 수 있도록 문서화되어 있습니다. 로컬 스택 차량은 문자열이나 인터페이스가 아니라면 0으로 설정되지 않으면 정의되지 않습니다.

부수적 노트와 마찬가지로 (Delphi를 처음 접하는 것처럼) : 글로벌 변수를 선언 할 때 직접 초기화 할 수 있습니다.

var myGlobal:integer=99;

다음은 Ray Lischners Delphi의 인용문입니다. 제 2 장

"Delphi가 먼저 물체를 생성하면 모든 필드가 비어있게 시작합니다. 즉, 포인터는 NIL로 초기화하고, 문자열 및 동적 배열이 비어 있고, 숫자는 값이 0이고 부울 필드는 거짓이며 변형이 설정되지 않은 상태로 설정됩니다. (자세한 내용은 5 장의 Newinstance 및 Intinstance를 참조하십시오.) "

현지인 변수가 초기화되어야한다는 것은 사실입니다 ... 나는 언급이 제공 될 때까지 모호한대로 "글로벌 변수가 초기화된다"는 위의 의견을 취급합니다. 나는 그것을 믿지 않습니다.

편집 ... 배리 켈리 (Barry Kelly)는 당신이 그들에게 초기화되지 않은 것에 의존 할 수 있다고 말하며, 델파이 컴파일러 팀에 있기 때문에 나는 그 견인이라고 생각합니다 :) 감사합니다.

글로벌 변수 및 객체 인스턴스 데이터 (필드)는 항상 0으로 초기화됩니다. 절차 및 방법의 로컬 변수는 Win32 Delphi에서 초기화되지 않습니다. 코드 값을 할당 할 때까지 콘텐츠가 정의되지 않습니다.

언어가 기본 초기화를 제공하더라도, 나는 당신이 그들에게 의존해야한다고 생각하지 않습니다. 값으로 초기화하면 언어의 기본 초기화에 대해 모르고 컴파일러의 문제를 방지하는 다른 개발자에게 훨씬 더 명확합니다.

Delphi 2007 도움말 파일 :

ms-help : //borland.bds5/devcommon/variables_xml.html

"글로벌 변수를 명시 적으로 초기화하지 않으면 컴파일러가 0으로 초기화합니다."

주어진 답변에 약간의 그립이 있습니다. Delphi 0은 글로벌의 메모리 공간과 새로 만들어진 물체를 제거합니다. 이건 보통 그들이 초기화되었음을 의미합니다. 그렇지 않은 경우 하나의 경우 : 특정 값을 가진 열거 된 유형. 제로가 법적 가치가 아니라면 어떻게됩니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top