2009-11-13 4 views
3

나는 동적 메모리 할당을 "손으로"놀고 있는데 MS에서 온 사람들이 새 배치를 구현하는 방법을보고 싶었지만 디버깅 할 때 코드로 넘어갔습니다 :새로운 배치의 마법?

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0() 
{ // construct array with placement at _Where 
return (_Where); 
} 

이 코드가 내 포인터를 가리키는 곳으로 내 객체를 놓는 방법을이 지구에 어떻게 설명할까요?이 코드에서 볼 수있는 것은 내가 인수로 제공 한 것과 return 문이있는 줄입니다. 나는이 fnc가 무엇을하고 싶은지에 대한 논평에서 실제로 그것이 작동하기에 충분하다고 생각하지 않는다. 건설적인 해답을 가져 주셔서 감사합니다.

답변

13

operator new의 목적은 객체에 대한 메모리를 할당하고 해당 메모리에 포인터를 반환하는 것입니다. 새로운 배치를 사용하면 본질적으로 컴파일러에게 "이 메모리가 좋다는 것을 알고 할당을 건너 뛰고 내 객체에이 포인터를 사용합니다."라고 말합니다. 방금 할당 된 메모리인지 여부 또는 새 배치를 사용하여 지정되었는지 여부와 상관없이 operator new이 제공하는 포인터를 사용하여 객체의 생성자가 호출됩니다. operator new 그 자체는 당신의 대상이 어떻게 구성되는지에 관계가 없습니다.

+0

는 당신이 더 그렇지 않으면 당신은 ... 문제가 배열을위한 새로운 배치를 수행하는 방법 SBI @ –

5

new T(...) ("new-expression"이라고하는 것)은 메모리 할당 및 객체 초기화라는 두 가지 점에 유의하십시오. 생성자를 작성하여 초기화를 조정할 수 있습니다. 할당을 위해 당신은 operator new이라고 씁니다. 따라서 이름에도 불구하고 operator new은 새로운 표현이하는 것의 한면만을 수행합니다.

게재 위치 새로 추가 된 개체는 사전 할당 된 메모리에 저장됩니다. 사전 할당 된 메모리를 직접 전달하는 생성자를 this 포인터로 호출 할 수 없습니다. 당신이 할 수있는 유일한 일은 새로운 배치를 사용하는 것입니다. 이것은 할당을 아무 작업으로도 바꾸지 않고 남겨놓은 것만 남겨 둡니다. 이

inline void* operator new(size_t, void *p) throw() 
{ 
    return p; 
} 

은 그 no-op의 구현 일뿐입니다.

+0

을 :: 수 있습니다 효과적으로 전달 된'size_t'을 수용 할 수있는 충분한 공간이 있음을 돌볼 거라고 어떤 의미? 내 코드를 참조하십시오. [link] (http://ideone.com/Yjc6y) – Atul

+0

@Atul : 코드를 잘 모르겠습니다. 어쨌든, 당신이하는 일은 배열의 개별 요소를 충분히 큰 메모리에 작성하는 것입니다. 그러나'std :: vector'는 정확히 이것을 수행하며 많은 종소리와 휘파람을 가지고 있습니다. 또한 자신의 코드보다 버그가 적습니다. 그렇다면 단순히 사용하지 않는 것이 어떻습니까? – sbi

관련 문제