찾다

 >  Q&A  >  본문

c++ - 能否帮忙解释一下placement new的原型

void operator new( size_t, void *p ) throw() { return p; }

这是我查到关于placement new的原型,size_t为什么在“new(&str1) std::string("abc");”中没有体现?为什么直接return p就可以了,是因为这个函数并没有写完全(只是原型)吗?

天蓬老师天蓬老师2805일 전631

모든 응답(1)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 15:41:48

    우선, 찾은 것은 new 배치 선언이 아니라, 연산자 배치 new 선언입니다. 이러한 연산자는 헤더 파일 new에 선언되어 있습니다.

    new 연산자 배치와 관련하여 C 11 표준에는 다음과 같은 규칙이 있습니다.

    18.6.1.3.1 이러한 함수는 예약되어 있으며 C 프로그램은 표준 C 라이브러리(17.6.4)의 버전을 대체하는 함수를 정의할 수 없습니다. (3.7.4)의 조항은 적용되지 않습니다. 연산자 new 및 연산자 삭제의 예약된 배치 형태입니다.

    요컨대, 이러한 새로운 대원 배치는 당분간 쓸모가 없습니다.

    그런 다음 new(&str1) std::string("abc") 표현식은 찾은 선언을 호출하지 않습니다(그러나 이 표현식은 내부적으로 연산자 배치 new를 호출합니다). 연산자 배치 new의 호출 방법은 ::operator new(size, pointer);입니다.


    C 에는 두 가지 종류의 new가 있습니다. 하나는 new 표현식이고 다른 하나는 Operator new입니다. 전자는 후자를 호출하여 메모리 할당을 완료한 다음 개체를 구성합니다. new 연산자는 헤더 파일 new에 정의되어 있습니다. 프로그램에 이 헤더 파일이 포함되어 있지 않으면 컴파일러는 자동으로 new 연산자 세트를 생성합니다.

    즉, 배치 new 표현식과 new 표현식은 각각 내부적으로 배치 new와 연산자 new를 호출합니다. 전자는 현재 "아무 작업"도 수행하지 않으며, 후자는 저장 영역을 "적용해야 합니다". (보통 클래스는 오버로드의 후자인 new 연산자를 오버로드합니다)

    회신하다
    0
  • 취소회신하다