Part 8:new 와 delete 맞 춤 형

계산 환경(예 를 들 어 자바 와.net)이 내 장 된'쓰레기 회수 능력'을 자랑 하 는 현재 C++메모리 관리 에 대한 순수한 수공 방법 은 촌 스 러 워 보인다.그러나 많은 까다 로 운 시스템 프로그램 개발 자 들 이 C++를 선택 한 이 유 는 메모리 관 리 를 수 동 으로 허용 하기 때문이다.이렇게 하 는 전 제 는 C++메모리 관리 루틴 의 행 위 를 이해 하 는 것 이다.이 부분의 두 주인공 은 분배 루틴 과 반환 루틴(allocation and deal location routines,즉 operator new and operator delete)입 니 다.조연 은 new-handler 입 니 다.이것 은 operator new 가 고객 의 메모리 수 요 를 만족 시 키 지 못 할 때 호출 되 는 함수 입 니 다.주의:STL 용기 에 사용 되 는 힙 메모 리 는 용기 가 가지 고 있 는 분배 기 대상 이 관리 하 는 것 이지 new 와 delete 에 의 해 직접 관리 되 는 것 이 아 닙 니 다.set_new_handler()방법 은 new 메모리 할당 에 실 패 했 을 때 시스템 에서 이 함 수 를 자동 으로 호출 합 니 다.오류 가 없 으 면 호출 하지 않 습 니 다.
#include<iostream>
using namespace std;

void fun()
{
    cout<<"error occur when allocate heap"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    std::new_handler p = fun;
    set_new_handler(p);


    long* pBigDataArray = new long[1000000000L];

    getchar();
    return 0;
}

서로 다른 클래스 가 분배 클래스 에 저장 되 는 데 오류 가 발생 하여 서로 다른 처리 함 수 를 호출 하려 면 함수 의 정 의 를 서로 다른 클래스 정의 에 넣 을 수 있 습 니 다.예 를 들 어 Widget class 의 메모리 할당 실패 상황 을 처리 하려 면 먼저"operator new 가 Widget 대상 에 게 충분 한 메모 리 를 할당 할 수 없 을 때"호출 하 는 함수 에 로그 인해 야 합 니 다.따라서 new 라 는 형식 을 설명해 야 합 니 다.handler 의 static 멤버,class Widget 을 가리 키 는 newhandler。 Widget 의 정 의 는 다음 과 같 습 니 다.
class Widget{
public:
    static std::new_handler set_new_handler(std::new_handler p) throw();
    static void* operator new(std::size_t size) throw(std::bad_alloc);
private:
    static std::new_handler currentHandler;
};
std::new_handler Widget::currentHandler = 0;

std::new_handler Widget::set_new_handler(std::new_handler p) throw()
{
    std::new_handler oldHandler = currentHandler;
    currentHandler = p;
    return oldHandler;
}

마지막 으로 위 젯 의 operator new 는 다음 과 같은 일 을 합 니 다.1 호출 표준 setnew_hanlder,Widget 의 오류 처리 함 수 를 알려 줍 니 다.Widget 의 newhandler 는 global new-handler 로 설치 되 어 있 습 니 다.2.global operator new 를 호출 하여 실제 메모리 분 배 를 실행 합 니 다.할당 에 실패 하면 global operator new 는 Widget 의 new-hanler 를 호출 합 니 다.그 함수 가 이제 막 global new-handler 로 설치 되 었 기 때 문 입 니 다.global operator new 가 최종 적 으로 충분 한 메모 리 를 할당 하지 못 하면 bad 를 던 집 니 다.alloc 이상.
4
  • Rule 50:new 와 delete 의 합 리 적 인 교체 시 기 를 알 고 Understand when it makes sense to replace new and delete.왜 컴 파일 러 가 제공 하 는 operator new 나 operator delete 를 교체 하려 고 합 니까?다음은 가장 흔히 볼 수 있 는 세 가지 이유 입 니 다.1.사용 상의 오 류 를 감지 하기 위해 분배 류 저장 소 뒤에 추가 공간 을 통 해 특정한 byte patterns,즉 서명 을 하면 operator deletes 는 상기 서명 이 그대로 있 는 지 확인 할 수 있 습 니 다.그렇지 않 으 면 분배 구역 의 특정한 생명 시간 에 변화 가 생 겼 음 을 나타 냅 니 다.2.효 과 를 강화 하기 위해.컴 파일 러 가 가지 고 있 는 operator new 와 operator delete 는 주로 일반적인 목적 에 사 용 됩 니 다.만약 에 프로그램의 동적 메모리 운용 형태 에 대해 깊이 알 고 있다 면 맞 춤 형 operator new 와 operator delete 의 성능 이 부족 한 버 전보 다 빠 르 고 필요 한 메모리 가 비교적 적 다 는 것 을 알 수 있 습 니 다.3.사용 상의 통계 데 이 터 를 수집 하기 위해..

  • 4
  • Rule 51:new 와 delete 를 작성 할 때 new 와 delete 를 작성 할 때 일반적인 adure to convention 을 고수 해 야 합 니 다
  • operator new 의 반환 값 은 매우 단순 합 니 다.만약 그 가 고객 이 신청 한 메모 리 를 공급 할 능력 이 있다 면 포인터 가 그 메모 리 를 가리 키 는 것 을 되 돌려 줍 니 다.그 능력 이 없 으 면 set 사용new_handler,그리고 bad 던 지기alloc 이상.Widget *pw = new Widget; 이 문 구 는 모두 두 개의 함수 가 호출 되 었 습 니 다.하 나 는 메모 리 를 분배 하 는 operator new 이 고 하 나 는 Widget 의 default 구조 함수 입 니 다.

    좋은 웹페이지 즐겨찾기