연산자 오버로딩과 삭제에 몇 가지 제한을 두는 것이 가능합니까? 오버로드 된 새 파일이 다른 파일에 내 테스트 프로그램에 연결되어 있습니다.과부하 신규 및 삭제에 대한 퍼팅 제한
시나리오는 다음과 같습니다
if(condition is satisfied)
call overloaded new
else
call the actual new defined in new.h
연산자 오버로딩과 삭제에 몇 가지 제한을 두는 것이 가능합니까? 오버로드 된 새 파일이 다른 파일에 내 테스트 프로그램에 연결되어 있습니다.과부하 신규 및 삭제에 대한 퍼팅 제한
시나리오는 다음과 같습니다
if(condition is satisfied)
call overloaded new
else
call the actual new defined in new.h
새 연산자를 제공하는 세 가지 방법이 있습니다.
한 새로운 네 비 배치 기본 연산자 더 치환(따라서 추가적인 파라미터와, 그가 배치 새로운 구문으로 호출 될 수있다) 새로운 기본 연산자에 과부하를 제공
,
운영자에게 새로운 클래스 멤버를 제공하면 해당 클래스와 그 하위 클래스에 대해서만 호출됩니다. 뒤의 두 경우
, 구문 새로운 더 잘 알고 연산자 중 하나를 호출 할 수 있습니다 :
ptr = ::operator new(sz);
ptr = ::operator new[](sz);
ptr = ::operator new(sz, std::nothrow);
ptr = ::operator new[](sz, std::nothrow);
을하지만, 당신이 그들을 교체 한 경우, 교체가 호출됩니다. 을 대체 한 새로운 기본 연산자를 호출 할 수 없습니다. 구현 관련 링커 트릭을 재생하면 가능하지만 언어의 범위를 벗어납니다.
새로운 연산자와 새로운 2 개의 연산자를 삭제해야한다. (같은 이유로)
항상 사용하여 new
/delete
과부하 및 구현 안에 당신의 상태를 확인합니다.
조건을 검사 할 수 있지만 틀린 경우 원래의 새 상태로 돌아가는 방법은 무엇입니까? new.h에서 새로운 것을 의미합니까? – kingsmasher1
@ Kingmasherher1 : 내 대답을보세요. 새로운 마법은 없습니다. – Patrick
기본값 ::operator new()
을 바꾸면 더 이상 사용할 수 없으며 영원히 사라졌습니다. See this question.
원본의 효과를 원한다면 ::operator new()
을 다시 구현해야합니다. 그리 어렵지는 않습니다.
과부하가 걸린 new 연산자에서 쉽게 확인을 수행 할 수 있습니다. new 연산자의 모든 특성을 구현해야합니다 (AProgrammer가 이미 지적했듯이).
원본/기본 새 기능 호출은 불가능하지만 직접 구현하는 것은 어렵지 않습니다. 결국 new는 메모리 만 할당합니다. 따라서 original/default new를 호출하는 대신 malloc, HeapAlloc 또는 시스템에있는 메모리 할당 루틴을 호출 할 수 있습니다. 구현을 삭제할 때 해당 메모리 할당 해제 메소드 (free, HeapFree, ...)를 호출해야합니다.
새 구현을 확인하기 위해 어떤 종류의 조건을 확인하지 않았습니까? '정적 인'조건 (응용 프로그램을 실행하는 동안 항상 동일한 결과를 제공한다는 의미)이라면 동일한 조건을 삭제 구현에 추가해야합니다.
조건이 상황에 따라 다르며 응용 프로그램을 실행하는 동안 변경되면 삭제 기능에 사용할 삭제 구현을 알 수있는 방법을 미리 알아야합니다. 새의 구현에
: 여기에 하나를 수행 트릭은 다음과 같다
를 반환 할 수 있도록 삭제의 mplementation :
과부하인가? 다른 서명과 게재 위치 새 구문으로 호출해야 함) 또는 대체 (즉, 호출하려는 버전과 동일한 서명)해야합니다. – AProgrammer
@STATUS_ACCESS_DENIED, 방금 추가했습니다 ... – AProgrammer
@AProgrammer : 아, ok :) – 0xC0000022L