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