전역 신규 및 삭제 연산자를 올바르게 대체하는 방법
우선 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
'development' 카테고리의 다른 글
Dapper는 like 연산자를 지원합니까? (0) | 2020.12.29 |
---|---|
같은 줄에 인쇄하려면 어떻게해야합니까? (0) | 2020.12.29 |
TeamCity Nuget Feed에서 특정 버전의 패키지를 제거하는 방법은 무엇입니까? (0) | 2020.12.29 |
CDI : beans.xml, 어디에 두어야합니까? (0) | 2020.12.29 |
하위 요소 클릭 이벤트가 상위 클릭 이벤트를 트리거합니다. (0) | 2020.12.29 |