>백엔드 개발 >C++ >대규모 코드베이스에서 전역 'new' 및 'delete' 연산자를 보편적으로 재정의하는 방법은 무엇입니까?

대규모 코드베이스에서 전역 'new' 및 'delete' 연산자를 보편적으로 재정의하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-03 13:08:02703검색

How to Universally Override Global `new` and `delete` Operators in Large Codebases?

전역 신규 및 삭제 연산자를 효과적으로 대체

문제:

전역 new 및 삭제 연산자 교체 사용자 정의 메모리 관리를 사용하는 삭제 연산자는 대규모 코드베이스에서 문제를 야기합니다. 모든 파일에 오버로드가 포함된 헤더 파일을 포함하는 것은 비현실적입니다. 이러한 오버로드의 보편적인 채택을 어떻게 보장할 수 있습니까?

해결책:

new 및 delete 연산자 재정의는 링크 타임에 수행되는 프로세스입니다. 연산자를 정의하는 별도의 번역 단위(TU)를 생성하고 이를 프로젝트에 연결하면 기존 코드베이스를 수정하지 않고도 기본 연산자를 전체적으로 대체할 수 있습니다.

코드 샘플:

다음은 new 및 delete 연산자를 정의하는 TU의 예입니다.

<code class="cpp">// optional_ops.cpp

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

void operator delete(void * p) throw()
{
  //...
}</code>

연산자 new 및 연산자 삭제에 대한 선언이 언어에 하드코딩되어 있으므로 헤더가 필요하지 않습니다. 그러나 std, std::bad_alloc 및 std::size_t와 같은 이름은 선언해야 할 수도 있습니다.

C 11 이상에 대한 대안:

C 11 decltype(sizeof(0))을 사용하여 크기 매개변수의 유형을 결정함으로써 새 오버로드를 정의하는 더 간단한 방법을 소개합니다.

<code class="cpp">void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
  //...
}</code>

위 내용은 대규모 코드베이스에서 전역 'new' 및 'delete' 연산자를 보편적으로 재정의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.