소멸자를 수동으로 호출하는 것이 정당한 경우는 언제입니까?
소멸자를 수동으로 호출하면 설계 결함이 있다는 개념이 종종 주장됩니다. 하지만 이 규칙에 예외가 있습니까?
반대 예: 수동 소멸자 호출이 필요한 경우
실제로 이것이 필요한 상황이 있습니다. 소멸자를 명시적으로 호출하려면:
1. 제어된 메모리 할당 해제:
메모리 할당 및 할당 해제가 객체 생성 및 소멸과 독립적으로 관리되는 경우 수동 소멸자 호출이 중요해집니다. 이러한 경우 기존 메모리 버퍼에 new 배치를 통해 객체 생성이 발생하고 명시적인 소멸자 호출을 통해 소멸이 발생합니다.
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
2. 특정 메모리 할당자:
또 다른 예는 std::Vector의 기본 std::allocator 사용입니다. 여기서 요소는 push_back 작업 중에 생성되지만 메모리 할당은 요소 생성 이전의 청크에서 발생합니다. 따라서 vector::erase는 특히 추가 push_back이 임박한 경우 메모리 할당을 해제하지 않고 요소를 파괴해야 합니다.
의미:
수동으로 소멸자를 호출하면 엄격한 위반이 될 수 있습니다. 객체 관리와 메모리 관리 사이의 경계를 모호하게 만드는 OOP 원칙. 그러나 메모리 할당과 할당 해제가 분리된 저수준 프로그래밍이나 시나리오에서는 적절할 수 있습니다.
게다가 무작위 수동 소멸자 호출은 설계 문제를 나타낼 수 있지만 특수 목적 클래스 내에서 지역화된 사용은 건전한 연습으로 간주됩니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3