내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
delete는 동적 공간을 해제하는 데 사용되고, delete[]는 여러 동적 공간을 해제하는 데 사용되는 것으로 알고 있는데, 이를 혼합하면 어떤 문제가 발생할까요? 블로그에서 많은 글을 읽어봤지만 만족스럽지가 않아서 어떤 내용인지, 그 이유는 무엇인지 알려드리고자 이 글을 썼습니다(피상적인 설명입니다. 정정해 주세요)。
---------------------------------------------------------------------------------------------------------------------------------
먼저 예를 살펴보겠습니다.
실행 결과는 다음과 같습니다.
그러나 소멸자를 명시적으로 작성하지 않으면 다음과 같습니다.
결과는 정상 작동입니다.
---------------------------------------------------------------------------------------------------------------------------------
왜?
시스템이 이러한 10개의 클래스 A 객체에 얼마나 많은 공간을 할당하는지 묻는다면 아마도 40바이트라고 대답할 것입니다.1A는 4바이트이고 10은 40바이트라는 것을 이해하기 쉽습니다. .그런데 실제로 소멸자를 직접 작성하면 총 44바이트가 할당됩니다. 소멸자를 작성하지 않으면 총 40바이트가 할당됩니다.。
소멸자를 작성한 후 왜 4바이트가 더 있습니까? 우리는 이 공간을 해제하기 위해 delete를 사용한 후에 소멸자가 자동으로 호출된다는 것을 알고 있습니다(한국어: 한국어: http://t.csdnimg.cn/f2FOj), (1) 소멸자를 직접 작성하는 경우 삭제는 이를 호출해야 합니다(실제로 삭제는 함수의 중첩 호출과 동일한 함수이기도 합니다.), 이 4바이트는 정확히 정수 크기입니다. 이 정수는 이 공간에 있는 개체 수를 기록하는 데 사용되므로 생성자와 소멸자가 몇 번 호출되어야 하는지 결정됩니다. 라고 불리는.그러나 p 포인터는 여전히 첫 번째 개체를 가리키지만 생성 및 소멸 중에 개체 수를 가져오기 위해 계속 진행된다는 점을 알아야 합니다., 구체적인 관계는 다음과 같습니다.
(2) 이때 소멸자를 작성하지 않으면 횟수를 기록하지 않고 컴파일러가 생성한 소멸자를 호출하게 됩니다(낮은 수준이 포함될 수 있으므로 잘 모르겠습니다. 정정해 주십시오). 추가로 성형수술을 할 필요가 없습니다.
좋아요, 이제 위의 예를 설명하겠습니다.
삭제는 기본적으로 포인터가 가리키는 위치에서 공간을 해제합니다. delete[]는 먼저 기본적으로 더 많은 공간이 열려 있는지 확인하고, 그렇다면 포인터를 해제하기 전에 한 위치 앞으로 이동합니다. 더 많은 공간을 열거나 삭제를 사용하여 공간을 해제하면 열린 공간을 해제할 수 없어 메모리 누수가 발생하므로 오류가 보고됩니다.
이것을 연습하면 오류가 발생합니까? :
소멸자를 호출할 필요도 없고, 객체의 수를 셀 필요도 없고, 더 많은 공간을 열 필요도 없기 때문에 포인터가 가리키는 위치에서 공간을 해제할 수 있으므로 오류가 발생하지 않습니다. 보고되었습니다.
여러가지 상황이 있으니, 직접 내려가서 해보셔도 됩니다.