2012-03-22 2 views
2

오늘 저는 코드 작성을 위해 약간의 메모리 프로파일 러를 작성했으며 처음으로 오버로드 된 operator new입니다. 그렇게하면서, 나는 문법이 void* operator new(size_t sz)이라고 생각했다. 이것은 실제로 void* malloc(size_t sz)malloc과 매우 유사합니다.void * in malloc 대 운영자 새로운

malloc을 사용할 때 데이터 형식에 포인터를 명시 적으로 다시 캐스팅해야하므로 새로운 기능의 경우에는이 작업을 수행 할 필요가 없습니다. 컴파일러는 new에 대한 올바른 데이터 유형을 어떻게 알 수 있습니까? 이있는 이유는 무엇입니까? void *을 반환하게합니까? T* operator new(size_t sz)이 더 직관적이지 않습니까?

+3

C에서는'malloc()'의 반환 값을 캐스팅 할 필요가 없습니다. 실제로 캐스팅은 중복되고, 컴파일러가 캐스트가 없을 때 잡았을 오류를 숨길 수 있습니다. – pmg

+0

@pmg, 진정해, 질문에 실제로'C '태그가 붙어서는 안된다. – Shahbaz

+0

'new'에 의해 할당 된 데이터를 '자유롭게'한다. –

답변

5

C++은 메모리 할당과 개체 구성을 분리합니다. 할당 함수 (예 : operator new())는 메모리으로 void *을 반환하고 new연산자은 해당 메모리에 객체를 구성합니다. 당신이 경우는 new 연산자는 객체에 메모리를 "변환"및 대해 게재 위치 new 표현은 "캐스트"와 같은 비트입니다 : new 수행 할당 및 건축

void * addr = ::operator new(sizeof(Foo)); // memory 

Foo * p = ::new (addr) Foo(1, true, 'a');  // object (note: no cast!) 

p->~Foo();         // it's almost over 

::operator delete(addr);      // now it's over! 

기본, 비 배치 형태 한 번에. 이 예제의 전반부와 도덕적으로 동일합니다. 그러나 여전히 할당과 건설은 두 가지 뚜렷한 개념으로 남아 있습니다.

+0

"operator new()"와 "new"연산자의 차이점을 설명해 주시겠습니까? 이 두 가지가 다른가요? 또한, 두 번째 행'Foo * p = :: new (addr) Foo (1, true, 'a');'는 무엇을 의미합니까? – GradGuy

+0

예, 그들은 다릅니다. 첫 번째는 함수입니다. 두 번째는 "새로운 표현"을 형성하는 언어 구조입니다. 'new' 표현식의 값은 새로 생성 된 객체에 대한 포인터입니다. 이 예제의 첫 번째 행은 할당 함수를 호출합니다. 두 번째 표현식은 (배치 형태로)'new' 표현을 포함합니다. 할당 함수가 자동으로 호출되는 * 기본 * 새 표현식을 작성하는 경우에만 할당 함수가 당신이 대체 (또는 클래스 당 오버로드) 할 수있는 유일한 것입니다. –

+0

감사합니다. 나는 그 사실을 몰랐다. :) – GradGuy

7

operator new 함수는 T*을 반환하지 않습니다. 반환 값은 T을 가리 키지 않지만 임의의 정크 만 나타 내기 때문입니다. 클래스 인스턴스에 대한 포인터가있는 생성자가 호출 될 때까지는 아닙니다.

+0

나는 operator new function이 실제로 생성자를 호출하고, 삭제할 시간이 왔을 때 소멸자를 등록하고, 자신의 메모리 관리를 원한다면 오버로드 될 수 있다고 덧붙이고 싶다. garbage collection) –

1

operator new과 new 연산자 사이에 차이가 있습니다. 후자는 주어진 유형의 객체를 만들고, 전자는 메모리를 할당합니다. 새 연산자는 생성되는 형식에 대해 operator new을 호출하거나 필요한 형식에 대해 버전이 정의되지 않은 경우 전역 operator new을 사용합니다. operator new 함수에서 T*을 반환 할 수 없으므로 아직 생성되지 않은 개체를 가리킬 수 있습니다. 객체는 생성자가 실행 된 후에 만 ​​생성됩니다 (예 : vtable 만들기, RTTI 정보 등의 하우스 키핑).

어떤 클래스에 대해서도 operator new을 무시할 수 있다는 것을 잊지 마세요. 실제로 메모리를 할당 할 필요가 없습니다. 단지 메모리에 대한 포인터 만 반환하면됩니다. 그 메모리는 예를 들어 사전 할당 된 청크에서 가져온 것일 수 있습니다.

1

operator newnew 연산자에 대해 사용자가 재정의 할 수있는 런타임 지원 기능으로, 적절하게 정렬되고 크기가 조정 된 메모리 블록 할당 서비스를 제공합니다. 이 함수는 new 연산자 자체가 아닙니다. 이 함수를 재정의 할 때 할당 서비스를 바꾸기 만하면 new 연산자 자체를 다시 쓰지는 않습니다. new 연산자는 헬퍼 호출로 컴파일되는 구문 설탕으로 생각할 수 있습니다 (operator new). 필요한 경우 메모리를 생성하고 초기화를 위해 생성자 호출을 얻습니다.