'새 연산자'와 '새 연산자'의 차이점은 무엇입니까?


126

"새 연산자"와 "새 연산자"의 차이점은 무엇입니까?


3
안녕하세요, 질문을 명확히 해주시겠습니까? 어딘가에 오타가있는 것 같습니다.
Dima Malenko

17
질문이 올바르게 작성되었습니다. 아래 답변을 참조하십시오. 메모리를 동적으로 할당하는 방법은 new연산자 를 사용하는 것 입니다. 이 연산자는 오버로드 될 수 있습니다. 기본 연산자와 오버로드 된 버전을 구분하기 위해 기본값은 "새 연산자"라고하고 오버로드 된 버전은 "새 연산자"라고합니다.
Thomas Matthews

2
그렇게하는 방법. 나는 새롭고 알지 못합니다.
Sandeep

답변:


127

나는 일반적으로 두 가지를 조금 더 잘 구별하기 위해 다른 표현을 시도하지만 어쨌든 좋은 질문입니다.

연산자 new는 원시 메모리를 할당하는 함수입니다. 최소한 개념적으로는 malloc(). 자신의 컨테이너와 같은 것을 작성하지 않는 한 매우 드문 일이지만 다음과 같이 operator new를 직접 호출 할 수 있습니다.

char *x = static_cast<char *>(operator new(100));

전역 적으로 또는 특정 클래스에 대해 new operator를 오버로드 할 수도 있습니다. IIRC, 서명은 다음과 같습니다.

void *operator new(size_t);

물론 new 연산자 (전역 또는 클래스)를 오버로드하는 경우 일치하는 연산자 delete도 오버로드해야합니다. 그만한 가치를 위해 배열에 메모리를 할당하는 데 사용되는 별도의 연산자 new []도 있습니다.하지만이 모든 것을 완전히 무시하는 것이 거의 확실합니다.

new 연산자는 일반적으로 무료 상점에서 객체를 만드는 데 사용하는 것입니다.

my_class *x = new my_class(0);

이 둘의 차이점은 new operator는 그저 원시 메모리 할당 한다는 것입니다. new 연산자는 new 연산자를 사용하여 메모리를 할당하는 것으로 시작하지만 올바른 유형의 객체에 대한 생성자를 호출하므로 결과는 해당 메모리에 생성 된 실제 라이브 객체가됩니다. 해당 객체에 다른 객체 (포함 또는 기본 클래스)가 포함되어 있으면 해당 생성자도 호출됩니다.


18
+1, 다른 구문에 관해서는 표준은 모든 곳에서 새로운 표현을 사용 하고, 호출 장소를 참조하기 위해 new 연산자 를 사용하는 경우에만 한 번만 사용합니다 . 나는 똑같은 일을하는 경향이있다 : 할당자를 위한 연산자 new 와 사용을위한 새로운 표현 .
David Rodríguez-dribeas 2011 년

3
새로운 표현은 new로 시작하는 전체 문구입니다. 그래서 당신은 그것의 "새로운"부분을 무엇이라고 부릅니까? new 연산자를 호출하는 것이 잘못된 경우 sizeof 연산자 "sizeof"또는 연산자 주소 & 연산자 (하나처럼 동작 할 때)를 호출해서는 안됩니다.
카즈

1
Kaz의 발언에 이어 아마도 질문은 다음과 같이 다시 표현되어야합니다. new operator와 operator new operator의 차이점은 무엇입니까? :)
CS

2
"operator new"vs "new keyword"
user997112 2014-08-08

2
@antred : 당신은 operator delete(x);.
Jerry Coffin 2014 년

35

"새로운 연산자"

class Foo
{
public:
        void* operator new( size_t );
}

"새 연산자":

Foo* foo = new Foo();

이 예에서는 다음을 new Foo()호출합니다.Foo::operator new()

즉, "새 연산자" operator new()는 + 연산자 호출처럼 " "를 호출합니다.operator +()


13
newC ++의 연산자가 아닙니다. sizeof예를 들어, 운전자이지만, newdelete아니다. newdelete키워드 및 이러한 키워드가 형성하는 구문 구조를 new-expressiondelete-expression이라고 합니다.
AnT 2009

2
어, 아무것도 경우, sizeof구문 구조이며, new그리고 delete모두 유효한, 법률, 과부하 수있는 운영자입니다. 모두에서 나는 본 것, new그리고 delete모두 운영자입니다. 참조 [cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
Austin Hyde

7
틀 렸습니다. 공식 C ++ 용어는 일부 웹 사이트가 아니라 언어 사양에 정의 된 용어입니다. 언어 사양에는 "새 연산자"와 같은 용어가 없지만 " operator new기능" 과 같은 용어가 있습니다. 다시, sizeof동안 explicilty,에 "연산자"라고 new하고 delete있다 결코 사업자라고합니다.
AnT 2009

6
AndreyT : 틀 렸습니다. C ++ 표준은 'new'연산자를 호출합니다 (13.5 / 1 참조).

3
@AndreyT : 당신이 생각했던 것처럼 new 연산자할당 자 이고 새로운 표현 이 사용하는 것입니다. §5.3.4 / 3에서 현재 표준이 new operator 라는 용어를 사용하는지 검토하고 확인했습니다 . 나중에 §5.3.4 / 8에서 할당 자 함수를 operator newoperator new []
David Rodríguez-dribeas 2011 년

22

다음은 Scott Meyers의 More Effective C ++ 책에서 인용 한 것입니다.

new 연산자는 함수를 호출하여 필수 메모리 할당을 수행하고 해당 함수를 다시 쓰거나 오버로드하여 동작을 변경할 수 있습니다. new 연산자가 메모리를 할당하기 위해 호출하는 함수의 이름은 operator new입니다.


7
이 용어는 분명히 책의 저자에 의해 발명되었습니다 (또는 쓸모없는 출처에서 빌려온 것일 수도 있습니다). 공식 C ++ 명명법에는 "새 연산자"와 같은 용어가 없습니다.
AnT 2009

2
@AndreyT : C ++ 11에서 "new operator"를 검색 한 결과 네 곳에서 참조되었습니다. 특히 "배치 신규 연산자"에 대한 두 가지 언급
Mooing Duck 2005

11

"new operator"와 "operator new"사이에는 차이가 없습니다. 둘 다 동일한 것을 참조합니다. operator new일반적으로 new-expressions에 의해 생성 된 객체에 대해 원시 메모리 할당을 수행 하는 오버로드 가능 / 교체 가능 함수입니다 .

또한 용어 모두 언어 사양 (공식 용어의 정의 소스)에 없습니다.

당신이 사용하는 경우 new객체를 생성하는 프로그램에서, 그것은이라고합니다 새로운 표현 . New-expressionnew문법에 정의 된 키워드 와 추가 구문 부분으로 구성됩니다. 이 표현식의 구문 중 어떤 부분도 "연산자"로 언급되지 않습니다.

원시 메모리 할당 기능 operator new은 공식적으로 " operator new기능"이라고합니다. 이 시퀀스 의 단어 operatornew는 두 개의 개별 C ++ 언어 키워드 일뿐입니다. 그들은 영어 용어 "operator new"를 형성하지 않습니다. 언어 사양 어디에도 영어 용어로 "operator new"에 대한 언급이 없습니다. 매번 이것은 메모리 할당 함수에 대한 선언 구문을 생성하는 두 개의 독립적 인 키워드의 조합입니다.

다시 말하지만, 이력서에서는 공식적으로 C ++에는 "operator new"또는 "new operator"와 같은 영어 용어가 없습니다. 이전 시퀀스는 언어 사양에 영어 용어가 아닌 키워드 조합으로 만 존재합니다. 후자는 전혀 존재하지 않습니다.


14
당신은 현학적 인 정신적 자위에 길을 잃은 것 같습니다. 표준은 부분적으로 모호하며 이것이 그중 하나입니다. "더하기 연산자에 대해 논의"또는 "+ 연산자에 대해 논의"하는 것만 큼 "새 연산자에 대해 논의"하는 것이 합리적입니다.

7

새 객체를 만들 때 new 연산자를 사용하여 메모리가 할당 되고 생성자가 메모리 를 초기화 하기 위해 호출됩니다 . 새로운 오퍼레이터 할당 오퍼레이터 새로운 만 할당 마찬가지로 초기화 모두를한다.


6

OP의 질문이 제대로 표현되지 않았습니다. '새로운 연산자'와 '새로운 표현'의 차이? ' 'operator new'는 종종 'operator new function'을 의미하기도합니다.

그리고 주위에 많은 정답이 있습니다. 아래는 내 것입니다.

1> 'new expression'은 'operator new'를 호출하여 원시 메모리를 할당 한 다음 생성자를 호출합니다.

apple * p = new apple(); //new expression

2> 'operator new'는 malloc과 크게 다르지 않은 원시 메모리 만 할당합니다.

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.

2

new 연산자 : C ++는 new 연산자를 사용하여 개체의 동적 할당을 지원합니다. new 연산자는 free store라는 풀에서 개체에 대한 메모리를 할당합니다. new 연산자는 특수 함수 연산자 new를 호출합니다.

operator new : 요청이 0 바이트의 저장 공간에 대한 것 인 경우, operator new는 고유 한 개체에 대한 포인터를 반환합니다 (즉, operator new에 대한 반복적 인 호출이 다른 포인터를 반환 함). 할당 요청을위한 메모리가 부족하면 new 연산자는 NULL을 반환하거나 예외를 throw합니다. new 연산자의 첫 번째 인수는 size_t 유형 (STDDEF.H에 정의 된 유형)이어야하며 반환 유형은 항상 void *입니다.

자세한 내용은 MSDN 링크입니다.

운영자의 새로운 기능

새로운 대원


1
약간의 설명 : 비 배치 연산자 new는 항상 할당 실패를 던져야합니다 (표준에 따라). 와 같은 배치 양식 ::new(std::nothrow)은 둘 중 하나를 수행 할 수 있습니다 (특정 예제는 널 포인터를 리턴 함).

1
  1. new 는 연산자이자 키워드입니다.

    2.13 && 2.12에서 [1] 참조.

  2. new 는 두 가지 일을합니다 : T * t = new T (arg);

    1) 객체에 대한 메모리 할당 : void * ptr = operator new (sizeof (T));

    // operator new연산자 가 아닌 함수 (c의 malloc와 유사)입니다 (3.7.4에서 [1] 참조). 그러나 항목 7 [2]는 그것도 운영자라고 말했습니다. 제 생각에는 연산자와 함수의 차이가 작으며, 오버로딩 연산자가 함수에 의해 구현된다는 것을 기억하면 알 수 있습니다.

    //이 연산자 / 함수 (operator new)를 여기에서 원하는대로 오버로드 할 수 있습니다.

    2) 할당 된 메모리에서 개체 초기화 : ptr에서 T :: T (arg) 호출

    // 컴파일러 만이 작업을 수행 할 수 있습니다. 나도 당신도 할 수 없습니다.

    // 또한 컴파일러는 T에 멤버 객체의 생성자와 기본 클래스의 생성자를 호출합니다. 그리고이 호출은 재귀 적입니다. 컴파일러 만이 할 수 있습니다.

  3. 그래서, operator new는 new의 임무의 일부를 수행하고,이 부분에서만 우리는 무언가를 할 수 있습니다.

    [1] : ISO / IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2] : 마이어스, 스콧. 효과적인 C ++, 세 번째.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.