2012-05-09 4 views
0

나는 newdelete을 키워드로 알고 있습니다.":: operator new"및 ":: operator delete"란 무엇입니까?

int obj = new int; 
delete obj; 

int* arr = new int[1024]; 
delete[] arr; 

<new> 헤더는 C++ 표준 헤더의 일부입니다. ::

#include <new> 
using namespace std; 

int* buff = (int*)::operator new(1024 * sizeof(int)); 
::operator delete(buff); 

"무엇 :

::operator new

::operator delete

이러한 연산자는 아래와 같이 사용 : 그것은 (나는 그들이 운영자입니다 모르겠습니다하거나 함수입니다) 두 개의 연산자를 가지고 operator new "및":: operator delete "? 그들은 newdelete 키워드와 다른가요?

답변

2

::은 전역 네임 스페이스에 정의 된 연산자를 호출하도록 컴파일러에 지시합니다.
글로벌 newdelete 운영자의 정규화 된 이름입니다.

replace the global new and delete operators as well as overload class-specific new and delete operators 수 있습니다. 따라서 한 프로그램에 두 가지 버전의 newdelete 연산자가있을 수 있습니다. 범위 분석 연산자의 정규화 된 이름은 컴파일러에게 클래스 별 클래스가 아닌 연산자의 전역 버전을 나타냅니다.

+0

그러나 프로그래머는'new' 헤더를 포함해야합니다. –

+1

@AmirSaniyan [placement new] (http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10)를 사용하려는 경우 새로운 헤더를 포함해야하는 유일한 이유는) – Benj

+0

@AmirSaniyan : 좋은 읽기 : [언제 C#에서 # 라이브러리가 필요합니까?] (http://stackoverflow.com/questions/2788388/when-is-include-new-library-required-in-c) –

2

::는 글로벌 네임 스페이스를

+0

'new'가 키워드 일 때 왜 전역 네임 스페이스를 사용해야합니까? –

+1

당신은 글로벌 네임 스페이스에서 새로운 것을 사용하고 있다는 것을 보여 주면 안됩니다. 그러나 할당 기능과 * new-expression *을 구분하기 위해 –

2

그들이 할당 및 역할 당기 기능을 의미한다. new 연산자는 두 가지를 수행합니다. 할당 자 함수를 호출하여 메모리를 가져오고 은 객체의 생성자를 호출합니다. delete 연산자도 두 가지를 수행합니다. 소멸자를 호출 한 다음 deallocator 함수를 호출합니다. 기본 할당 자 함수는 ::operator new이고 기본 할당 해제 자 함수는 ::operator delete입니다. 둘 다 일 수 있습니다. 이 멤버 함수 내에서 호출 통상 함수 인 경우가되는 바와 같이 새로운 표현에서 ::operator new 기능이 다소 동일한 방법에 보았다는 것을

참고. 정상 함수에 관해서는 연산자를 사용하여 조회를 변경할 수 있습니다. new MyClass operator new (있는 경우); ::new MyClassMyClass이 구성원 operator new을 정의하는 경우에도 기본 할당자인 을 사용합니다.

+0

+1이 필요한 경우 새 버전을 재정의 할 수 있습니다. 둘 다 구문에'new' 키워드를 사용합니다. –

4

new 키워드 (단독 사용)는 operator new 기능과 동일하지 않습니다.

Object* p = new Object(value); 

를 호출

단지 메모리를 할당

void* v = operaor new(sizeof(Object)); 
p = reinterpret_cast<Object*>(v); 
p->Object::Object(value); //this is not legal C++, it just represent the implementation effect 

운영자 새로운 (또는 더 나은 void* operator new(size_t) 변형)를 호출의 것과 동일합니다, 그러나 어떤 객체 생성하지 않습니다.

new 키워드는 연산자 new 함수를 호출하지만 개체 생성자를 호출합니다. 건설사에서 별도의 할당으로

, new 연산자의 변형은

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

로 선언되고 이전 코드는 일반적으로

Object* p = reinterpret_cast<Object*>(operator new(sizeof(Object))); //no contruction here 
new(p) Object(value); //calls operator new(size_t, void*) via keyword 

로 작성되는 operator new(size_t, void*) 자체 아무것도하지만, 존재하지 않는 키워드에 의해 호출되면 생성자가 호출됩니다.

역으로, 파괴 및 할당 해제

p->~Object(); 
operator delete(p); //no destructor called 

대신 delete p로 분리 될 수있다; 소멸자를 호출 한 다음 operator delete(void*)을 호출합니다.