2014-12-27 3 views
0

오늘은 약간의 소스 코드 불구하고 읽고 있던 나는이왜 ptr을 저장하지 않고 new를 호출할까요?

Pool<C> *pool = accomodate_component<C>(); 
new(pool->get(id.index())) C(std::forward<Args>(args) ...); 

가 발생하여이 라인은 나에게

new(pool->get(id.index())) C(std::forward<Args>(args) ...); 

나는 심지어 법적 C++의 것을 생각하지 않았다 혼란. 결과적으로 pool->get(id.index())은 C++에게 할당해야하는 크기를 명시 적으로 알릴 수 있다고 알려주는 크기를 반환합니다.

는 내가 고개를 예 그것은 그런 식으로

void* operator new (std::size_t count); 지금이 법적 C++ 것을 알고 있지만 내가 모르는 것이 그 목적입니다 정의된다.

내가 왜 new(size) Foo();으로 전화를 걸겠습니까? 이것이 메모리 누출이 아니어야합니까? 그리고 그것은 완전히 무의미하지 않습니까? 만약 내가 ptr을 가지고 있지 않다면 어떻게 접근 할 수 있을까요?

+0

[새 게재 위치] (http://www.parashift.com/c++-faq/placement-new.html). – Pradhan

+6

게재 위치가 새 것입니다. 그들은 포인터를 저장하지 않습니다. 포인터가 객체를 배치 한 위치를 알고 있기 때문입니다. 이 새로운 형태의 메모리는 실제로 메모리를 할당하지 않습니다. – sp2danny

답변

6

이것은 괄호 안에 지정된 위치에 객체를 배치하는 호출 배치 new입니다. 일반화 된 union이 클래스 유형을 수용 할 때 나는 new이라는 배치를 좀 더 널리 사용되기를 기대합니다. 태그를 클래스 유형으로 변경하려면 아마도 배치를 사용하여 객체를 구성해야합니다. new (분명히 이전에 객체를 수동으로 파괴 한 후 그 자리에, 있다면).

게재 위치 newnew ed 오브젝트의 위치는 쉽게 알 수 있으므로 주소를 캡처 할 필요가 없습니다. new을 배치하는 유일한 방법은 새로 생성 된 객체의 생성자에서 예외가 발생하는 것뿐이므로 결과를 확인하는 데는 아무런 문제가 없습니다.

+0

일반화 된 유니온에 대해 새로운 배치를 사용하는 방법에 대해 설명하거나 자세히 설명해 주시겠습니까? 나는 같은 기술이 사용되는 것을 본다. (https://isocpp.org/wiki/faq/cpp11-language-types#generalized-unions) 그러나 왜 당신이'case Tag :: text : new가 필요한지 모르겠다. (& s) (ws); 'case :: 대신 단절'; Tag :: text : s = w.s; – Pradhan

+1

@ 프라 돈 : 그건 별개의 질문이 아니 겠지 ...? 짧은 대답은 다음과 같습니다. 태그가 변경되면 해당 위치에 객체가 없습니다. 그러나 할당에서는 대상 객체가 적절한 불변량을 설정했다고 가정합니다. 원시 메모리에 대한 구성과 할당의 차이점은 동일합니다. –