development

전역 신규 및 삭제 연산자를 올바르게 대체하는 방법

big-blog 2020. 12. 29. 08:22
반응형

전역 신규 및 삭제 연산자를 올바르게 대체하는 방법


우선 SO에 대해 비슷한 주제를 가진 주제가 4 ~ 5 개 이상있었습니다. 나는 그들 각각을 읽었고 그들이이 특정 문제에 대해 정말로 도움이되지 않는다고 생각합니다. 다른 사람이 중복 질문을 발견하면 사과드립니다. 매우 일반적인 질문처럼 보이기 때문에 이것을 게시하기 전에 나는 내 몫의 검색을 수행했습니다.

Windows 7에서 Visual Studio .NET 2003을 사용하고 있습니다.

진단을 위해 malloc () 및 free ()에 대한 내 사용자 정의 호출을 가리키는 new / delete 오버로드가 있습니다. 내 새 / 삭제 오버로드는 몇 개의 파일에 포함 된 헤더 파일에 있습니다.

문제는 코드 기반이 거의 스파게티이며 이러한 오버로드가 모든 것에 사용되도록하는 쉬운 방법이 없다는 것입니다. 블랙 박스 인 타사 라이브러리에 대한 포함이 있습니다. 우리는 또한 모든 곳에서 STL을 사용합니다.

내 테스트에서 STL이 여전히 내 자신의 new / delete 및 표준 MSVC new / delete 호출에 대한 호출을 혼합하고 있음을 발견했습니다.

내 헤더 파일을 수천 개의 다른 파일에 포함시키는 것은 현실적이지 않은 것 같습니다. 너무 오래 걸립니다. 누구나 내 사용자 정의 메모리 관리자를 사용하도록 전역 적으로 신규 / 삭제를 적절하고 효과적으로 오버로드하는 방법에 대한 몇 가지 팁을 제공 할 수 있습니까?


이것이 작동하는 방식이 아닙니다. 당신은 대체 두 개의 연산자를,이은에 완료 링크 시간. 이러한 연산자 정의 하는 단일 TU를 작성하고 이를 믹스에 연결하기 만하면됩니다. 아무도 이것에 대해 알 필요가 없습니다.

// optional_ops.cpp

void * operator new(std::size_t n) throw(std::bad_alloc)
{
  //...
}
void operator delete(void * p) throw()
{
  //...
}

원칙적으로 이러한 함수 ( operator new, operator delete) 를 선언하기 위해 헤더 파일이 필요하지 않습니다. 이 두 함수 선언 은 원하는 경우 이미 언어로 하드 코딩되어 있기 때문입니다. 그러나, 이름이 std, std::bad_alloc그리고 std::size_t있다 하지 그래서 당신은 아마 포함 할 것, 미리 선언 <new>그 이름을 제공하기 위해 다른 헤더 또는.

C ++ 11 이상 decltype(sizeof(0))에서는 어떤 종류의 라이브러리도 필요로하지 않는 방식으로 첫 번째 매개 변수의 크기를 가져 오는 데 사용할 수 있습니다 . C ++ 11에는 동적 예외 사양이없는 더 간단한 예외 모델도 있습니다 (C ++ 17에서 언어에서 완전히 제거됨).

void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
  //...
}

또한 다음 행을 추가하십시오.

void *operator new[](std::size_t s) throw(std::bad_alloc)
{
    // TODO: implement
    return NULL;
}
void operator delete[](void *p) throw()
{
    // TODO: implement
}

참조 URL : https://stackoverflow.com/questions/8186018/how-to-properly-replace-global-new-delete-operators

반응형