나는 을 C++에 사용하고 싶지만 예외는 사용하지 않습니다. 함수에서 map<int, int> my_map
을 사용한 후 어떻게 내부적으로 메모리를 할당했는지 확인할 수 있습니까? (예외가 발생하면 메모리를 할당 할 수없는 새로운 예외가 예외를 throw합니다)예외를 사용하지 않는 경우지도를 만들 수 있는지 확인하는 방법은 무엇입니까?
답변
예외를 사용하는지 여부에 관계없이 표준 컨테이너는 메모리 할당에 실패하면 std::bad_alloc
을 던집니다 (기본 할당자를 사용하는 경우). 이것을 잡아 내지 않으면 프로그램이 종료되므로이 경우 예외를 포착하지 않고 성공을 확인할 방법이 없습니다.
예외를 근본적으로 제거하려는 경우 (내 생각에 표준 라이브러리를 사용하지 않으려는 경우에도 좋지 않은 생각) 표준 컨테이너를 버리고 원하는 컨테이너를 다시 작성해야합니다. 비표준 할당 모델을 사용하고 실패를 확인하고 전파하십시오. 표준 컨테이너는 모두 할당이 성공하거나 던질 것으로 가정하므로 보장을 제공하지 않는 할당자가 사용할 수 없습니다.
예외 사용 여부에 상관없이 C++ 라이브러리는 예외를 사용하여 할당 오류를 발생시킵니다. 정말로 피하기를 원한다면, 할당 자 또는 적어도 자신의 글로벌 연산자 new에 대해 알아야하고, 메모리를 사용할 수 없을 때 다른 스키마 (전역 변수에 함수를 호출하는 것)가 필요합니다.
그러나'new'에'nothrow'를 지정할 수 있습니다. 맞습니까? 용기가 그것을 사용하지 않는 이유는 무엇입니까? – gruszczy
@ gruszczy : 오류가 발생했을 때 컨테이너는 무엇을할까요? –
@gruszczy : 표준 컨테이너는'new'를 사용하지 않습니다; 표준 할당 자 요구 사항을 충족시키는 유형을 사용합니다. 이러한 요구 사항 중 하나는 유효한 포인터를 반환하거나 예외를 throw하는'allocate' 함수입니다. –
예외는 C++ 표준의 일부가 아니므로 컴파일러 관련 동작을 수행하게됩니다. 즉, 적어도 GCC의 경우 기본 연산자 new는 malloc()이 실패 할 경우 예외를 throw하는 대신 -fno-exceptions로 컴파일하면 프로그램을 중단합니다.
예외를 던지기를 원하지 않는 경우에는 자신의 할당자를 작성하고지도에 사용하십시오 (typedef std::map<int, int, std::less<int>, MyAllocator> my_map;
).
메모리 부족 상황을 처리하기 위해 내부 논리를 작성해야하며 표준 인터페이스는 명백한 인터페이스를 제공하지 않습니다.
하이브리드 솔루션으로 정적 메모리 풀에서 메모리를 가져 와서 전체 오류 처리기를 호출하는 할당자를 작성할 수 있습니다.
- 1. 어레이가 있는지 확인하는 방법은 무엇입니까?
- 2. 프린터가 있는지 확인하는 방법은 무엇입니까?
- 3. 핀을 연결할 수 있는지 확인하는 방법은 무엇입니까?
- 4. 버퍼에 쓸 수 있는지 확인하는 방법은 무엇입니까?
- 5. INSERT IGNORE를 사용하지 않고 mysql에 행이 있는지 확인하는 방법은 무엇입니까?
- 6. jar 파일을 Android에서 실행할 수 있는지 확인하는 방법은 무엇입니까?
- 7. 현지화가 있는지 확인하는 방법은 무엇입니까?
- 8. 시트가 있는지 확인하는 방법은 무엇입니까?
- 9. XElement를 사용하여 요소가 있는지 확인하는 방법은 무엇입니까?
- 10. GWT Panel이 비어 있는지 확인하는 방법은 무엇입니까?
- 11. 개체가 있는지 확인하는 방법은 무엇입니까?
- 12. 직렬 포트가 닫혀 있는지 확인하는 방법은 무엇입니까?
- 13. 특정 어셈블리가 있는지 확인하는 방법은 무엇입니까?
- 14. Lucene.Net Index가 폴더에 있는지 확인하는 방법은 무엇입니까?
- 15. HTML을 사용하지 않는 체크 박스를 어둡게 만들 수있는 방법은 무엇입니까?
- 16. ZF2 뷰 템플릿이 있는지 확인하는 방법은 무엇입니까?
- 17. ObjectDataProvider를 사용하지 않는 방법은 무엇입니까?
- 18. 문자가 문자열에 있는지 확인하는 방법은 무엇입니까?
- 19. MongoID와의 관계가 있는지 확인하는 방법은 무엇입니까?
- 20. 사용자가 iCloud에 로그인되어 있는지 확인하는 방법은 무엇입니까?
- 21. 소켓이 PHP에서 열려 있는지 확인하는 방법은 무엇입니까?
- 22. 파일이 자바 스크립트에 있는지 확인하는 방법은 무엇입니까?
- 23. 파일 내용이 비어 있는지 확인하는 방법은 무엇입니까?
- 24. 루프에서 폴더가 비어 있는지 확인하는 방법은 무엇입니까?
- 25. PHP로 로컬 서버에 액세스 할 수 있는지 확인하는 방법은 무엇입니까?
- 26. 트리거가있는 테이블 행이 있는지 확인하는 방법은 무엇입니까?
- 27. SQLCMD.exe가 설치되어 있는지 확인하는 적절한 방법은 무엇입니까?
- 28. 프록시 서버가 구성되어 있는지 확인하는 방법은 무엇입니까?
- 29. .NET에서 서버에 연결할 수 있는지 확인하는 가장 좋은 방법은 무엇입니까?
- 30. Xcode 4에서 사용하지 않는 변수를 확인하는 방법
이 모든 것을 잘 알고 있습니다. 고마워. – gruszczy
표준은 'new' 연산자의 nothrow 버전을 설명하기 때문에 비표준 할당 모델은 필요 없습니다. 표준 라이브러리는 사용할 수 없습니다. –
@MooingDuck : "비표준 할당 모델"에 의해, 표준 컨테이너 라이브러리에 지정된 할당 자 요구 사항과 다르게 작동하는 것이 었습니다. 언어 표준 외부의 것이 아닙니다. –