“새 연산자”와 “새 연산자”의 차이점은 무엇입니까?
답변
나는 일반적으로 두 가지를 조금 더 잘 구별하기 위해 다른 표현을 시도하지만 어쨌든 좋은 질문입니다.
연산자 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-expression 은 new
문법에 정의 된 키워드 와 추가 구문 부분으로 구성됩니다. 이 표현식의 구문 중 어떤 부분도 “연산자”로 언급되지 않습니다.
원시 메모리 할당 기능 operator new
은 공식적으로 ” operator new
기능”이라고합니다. 이 시퀀스 의 단어 operator
와 new
는 두 개의 개별 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 링크입니다.