첫 번째 상황:
C++ 객체 배열 생성 시 초기화 목록을 통해 할당하면 임시 변수가 생성되는데 소멸자는 왜 호출되지 않나요?
코드는 다음과 같습니다.
출력 결과는 다음과 같습니다.
그 중 Point A[2]={Point(1,2),Point()};는 두 개의 임시 변수를 통해 객체 배열 A를 초기화합니다. 왜 소멸자가 호출되지 않습니까? 이 두 개의 임시 객체입니다.
두 번째 경우:
배열의 각 요소에 대해 생성자를 명시적으로 호출하면 소멸자가 자동으로 호출됩니다.
코드는 다음과 같습니다.
실행 결과는 다음과 같습니다.
각 배열 요소에 대해 생성자 초기화를 호출한 후 임시 변수가 소멸되는 것을 볼 수 있습니다.
결론적으로 두 경우 모두 임시 변수인데 왜 하나는 자동으로 소멸되고 다른 하나는 소멸되지 않는 걸까요? ! !
黄舟2017-05-16 13:26:00
오류를 수정하기 위해 정보를 다시 확인하고 직접 연습했습니다
이유: 객체 할당은 오른쪽 객체의 멤버 값을 왼쪽 객체에 복사한 후 오른쪽 객체를 해제하는 것입니다.
—————— ————
B()가 호출될 때마다(매개변수 유무와 관계없이) 임시 객체가 생성됩니다
사례 1. 임시 객체(A에 저장됨)에는 그 뒤에 값이 할당되지 않습니다. 생성되었으므로 올바른 프로세스에서 객체를 해제할 방법이 없으며 A의 객체는 main()이 끝날 때까지 유지됩니다.
Case 2. p 배열에 값을 할당하고 임시 객체를 생성하여 원래 객체(즉, p 초기화 시 자동으로 생성된 임시 객체)만 할당되고, 맞죠. 옆에 있던 임시 변수도 소멸되고, 삭제 시 p에 저장된 임시 객체도 소멸됩니다
————— —————
A의 오른쪽에 있는 임시변수가 소멸되지 않는 이유는 생성을 해보면 알 수 있습니다. 이것을 함수로 출력한 뒤, A에 저장된 객체에 대한 참조를 출력하면 알 수 있습니다. 틀린 부분이나 이해가 안 되는 부분이 있으면 지적해 주시면 시간 내에 수정하거나 답변해 드리겠습니다
高洛峰2017-05-16 13:26:00
1. 스택 공간 응용 변수의 수명은 범위를 초과하면 소멸됩니다.
2. 삭제는 당연합니다. 우선 B[3]도 스택 공간이지만 재할당하고 나면 미션이 종료되므로 최대한 빨리 재활용해야 한다.
大家讲道理2017-05-16 13:26:00
으아아아
Array A는 함수의 로컬 변수이고 메모리는 스택 영역에 할당됩니다. Point(1,2)와 Point()도 로컬 변수이며 스택 영역에 할당됩니다. 이때 컴파일러는 일반적으로 메모리 재활용 및 할당을 줄이기 위해 최적화를 수행합니다.
배열 p의 메모리 공간은 동적으로 할당되며 힙 영역에 위치합니다. B(0), B(7), B(5, 9)는 스택 영역에 할당된 지역 변수이다.
두 당사자의 메모리 할당 위치가 다르며 컴파일러는 이를 최적화할 수 없으며 정직하게만 파괴할 수 있습니다.