일반적으로 동적 할당이 허용되지 않고 예외가 허용되지 않는 안전 소프트웨어를 고려하십시오. 동적 할당은 클래스 explicity가 연산자 new
및 delete
을 정의 할 때만 허용됩니다. 연산자 new
을 다른 클래스에 사용하면 컴파일 오류가 발생합니다. 한편 표준 라이브러리이 원인 부작용을글로벌 운영자가없는 베어 메탈 new
void* operator new(std::size_t) = delete;
:
이러한 상황에서 컴파일 오류가 발생할 수있는 가장 간단한 방법은 글로벌 new 연산자를 제거하는 것입니다. 예를 들어 <array>
을 포함하면 <new_allocator>
에 포함이 전파됩니다 (<stdexcept>
). <new_allocator>
은 ::new
연산자를 사용하므로 예외 및 메모리 할당을 사용하지 않으려는 경우에도 빌드가 실패합니다. Scoot Meyers에 따르면 <array>
은 베어 메탈이어야합니다. 컴파일러
이 원인 오류가 내장 연산자
src/main.cpp:91:31: error: deleted definition of 'void* operator new(std::size_t)'
void* operator new(std::size_t) = delete; ^
<built-in>: note: previous declaration of 'void* operator new(std::size_t)'
는 ::new
을 금지하고 <array>
를 사용하는 모든 솔루션이 있습니까?
::new
을 전체적으로 금지 할 해결책이 있습니까 전혀입니까? 에 관계없이 당신이 사용하는 어떤 프로그래밍 언어의
링크 시간에 조금 후에 오류가 발생합니까? –
@Marc 빌드에 전혀 실패한 솔루션을 사용해도 좋습니다. –
가끔은 C에 대한 좋은 이유가 있습니다. 이것은 그들 중 하나처럼 들립니다. C는 숨겨진 오버 헤드를 생성하지 않습니다. '새'만이 유일한 문제는 아니지만 불신감으로 인해 문제가 발생할 수도 있습니다. 인터럽트 처리기 및 기타 시간이 중요한 경로. – Olaf