‘새 연산자’와 ‘새 연산자’의 차이점은 무엇입니까? “새 연산자”의 차이점은 무엇입니까?

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



답변

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

연산자 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 연산자를 사용하여 메모리를 할당하는 것으로 시작하지만 올바른 유형의 객체에 대한 생성자를 호출하므로 결과는 해당 메모리에 생성 된 실제 라이브 객체가됩니다. 해당 객체에 다른 객체 (포함 또는 기본 클래스)가 포함되어 있으면 해당 생성자도 호출됩니다.


답변

“새로운 연산자”

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

“새 연산자”:

Foo* foo = new Foo();

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

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


답변

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

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


답변

“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”와 같은 영어 용어가 없습니다. 이전 시퀀스는 언어 사양에 영어 용어가 아닌 키워드 조합으로 만 존재합니다. 후자는 전혀 존재하지 않습니다.


답변

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


답변

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.

답변

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 링크입니다.

운영자의 새로운 기능

새로운 대원