2011-02-24 6 views
2

연산자 오버로딩과 삭제에 몇 가지 제한을 두는 것이 가능합니까? 오버로드 된 새 파일이 다른 파일에 내 테스트 프로그램에 연결되어 있습니다.과부하 신규 및 삭제에 대한 퍼팅 제한

시나리오는 다음과 같습니다

if(condition is satisfied) 
    call overloaded new 
else 
    call the actual new defined in new.h 
+0

과부하인가? 다른 서명과 게재 위치 새 구문으로 호출해야 함) 또는 대체 (즉, 호출하려는 버전과 동일한 서명)해야합니다. – AProgrammer

+0

@STATUS_ACCESS_DENIED, 방금 추가했습니다 ... – AProgrammer

+0

@AProgrammer : 아, ok :) – 0xC0000022L

답변

0

새 연산자를 제공하는 세 가지 방법이 있습니다.

한 새로운 네 비 배치 기본 연산자 더 치환
  • (따라서 추가적인 파라미터와, 그가 배치 새로운 구문으로 호출 될 수있다) 새로운 기본 연산자에 과부하를 제공

  • ,

  • 운영자에게 새로운 클래스 멤버를 제공하면 해당 클래스와 그 하위 클래스에 대해서만 호출됩니다. 뒤의 두 경우

, 구문 새로운 더 잘 알고 연산자 중 하나를 호출 할 수 있습니다 :

ptr = ::operator new(sz); 
ptr = ::operator new[](sz); 
ptr = ::operator new(sz, std::nothrow); 
ptr = ::operator new[](sz, std::nothrow); 

을하지만, 당신이 그들을 교체 한 경우, 교체가 호출됩니다. 을 대체 한 새로운 기본 연산자를 호출 할 수 없습니다. 구현 관련 링커 트릭을 재생하면 가능하지만 언어의 범위를 벗어납니다.

  • 당신이 두 사업자 새로운 대응하는 두 개의 연산자가 함께 삭제 (또는 delete 연산자 중 하나가 쉽게 예기치 않은 포인터를 호출 할 수있다) 교체해야
  • 당신에게 : new 연산자의 교체에 대해

    새로운 연산자와 새로운 2 개의 연산자를 삭제해야한다. (같은 이유로)

  • 새로운 핸들러에서 가능한 것은 무엇인지주의를 기울여야한다.
3

항상 사용하여 new/delete 과부하 및 구현 안에 당신의 상태를 확인합니다.

+0

조건을 검사 할 수 있지만 틀린 경우 원래의 새 상태로 돌아가는 방법은 무엇입니까? new.h에서 새로운 것을 의미합니까? – kingsmasher1

+0

@ Kingmasherher1 : 내 대답을보세요. 새로운 마법은 없습니다. – Patrick

1

기본값 ::operator new()을 바꾸면 더 이상 사용할 수 없으며 영원히 사라졌습니다. See this question.

원본의 효과를 원한다면 ::operator new()을 다시 구현해야합니다. 그리 어렵지는 않습니다.

0

과부하가 걸린 new 연산자에서 쉽게 확인을 수행 할 수 있습니다. new 연산자의 모든 특성을 구현해야합니다 (AProgrammer가 이미 지적했듯이).

원본/기본 새 기능 호출은 불가능하지만 직접 구현하는 것은 어렵지 않습니다. 결국 new는 메모리 만 할당합니다. 따라서 original/default new를 호출하는 대신 malloc, HeapAlloc 또는 시스템에있는 메모리 할당 루틴을 호출 할 수 있습니다. 구현을 삭제할 때 해당 메모리 할당 해제 메소드 (free, HeapFree, ...)를 호출해야합니다.

새 구현을 확인하기 위해 어떤 종류의 조건을 확인하지 않았습니까? '정적 인'조건 (응용 프로그램을 실행하는 동안 항상 동일한 결과를 제공한다는 의미)이라면 동일한 조건을 삭제 구현에 추가해야합니다.

조건이 상황에 따라 다르며 응용 프로그램을 실행하는 동안 변경되면 삭제 기능에 사용할 삭제 구현을 알 수있는 방법을 미리 알아야합니다. 새의 구현에

: 여기에 하나를 수행 트릭은 다음과 같다

  • 요청한 것보다 8 바이트 이상을 할당 처음에
  • 채우기를 (이 올바른 정렬을 유지하기 위해 8 바이트이어야 함) 식별 8 바이트는 메모리 할당 함수 기본이 할당 된 포인터에 8 바이트를 추가
  • 을 사용하는 알고 당신의 난에서 이것

를 반환 할 수 있도록 삭제의 mplementation :

  • 빼기
  • 체크 그 장소에서 발견 된 식별을 제공 한 포인터의 8 바이트 (새 참조)는 호출해야 기본 삭제-구현의 종류를 볼 수