2013-01-03 2 views
4

다음 코드 등장 : :: 새로운 의미는 무엇입니까? 는 MS 다이렉트 X 11 DXUT의 예를 살펴보면

template<typename TYPE> HRESULT CGrowableArray <TYPE>::SetSize(int nNewMaxSize) 
{ 
int nOldSize = m_nSize; 

if(nOldSize > nNewMaxSize) 
{ 
    assert(m_pData); 
    if(m_pData) 
    { 
     // Removing elements. Call dtor. 

     for(int i = nNewMaxSize; i < nOldSize; ++i) 
      m_pData[i].~TYPE(); 
    } 
} 

// Adjust buffer. Note that there's no need to check for error 
// since if it happens, nOldSize == nNewMaxSize will be true.) 
HRESULT hr = SetSizeInternal(nNewMaxSize); 

if(nOldSize < nNewMaxSize) 
{ 
    assert(m_pData); 
    if(m_pData) 
    { 
     // Adding elements. Call ctor. 

     for(int i = nOldSize; i < nNewMaxSize; ++i) 
      ::new (&m_pData[i]) TYPE; 
    } 
} 

return hr; 
} 

는 DXSDK (2010 년 6 월)의 내 버전에 라인 (428)에 DXUTmisc.h에서 찾을 수 있습니다. 나는 그것에 대해 궁금한가요 :: 새로운 건 .... 구글과 스택 오버플로에 대한 검색을 시도하고 있지만 검색 엔진에 ":: new"를 입력하면 검색 엔진이 두 개의 콜론을 버리는 것 같습니다. ...

+1

'::'는 [범위 분석 연산자] (http://en.wikipedia.org/wiki/Scope_resolution_operator)이며 전역 범위를 지정합니다. 전역 범위에서'new'가 호출되는지 확인합니다. – Joe

답변

10

::new 호출은 프로그램이 클래스 또는 네임 스페이스 범위에 정의 된 new 연산자를 사용하는 대신 전역 new 연산자를 사용하여 공간을 할당하려고한다는 것을 의미합니다. 특히이 코드는 생성되는 객체가 메모리의 특정 위치에 배치되는 placement new을 사용하려고합니다. 명시 적으로 전역 범위로 다시 호출하여이 함수는 올바르게 배치를 사용하고 실수로 범위 체인의 어딘가에 다른 할당 함수를 호출하지 않도록합니다.

희망이 도움이됩니다.

+0

XY 질문을 지적하기 위해 +1. (그들은 X에게 물어 보았지만 실제로 Y를 알아야했습니다.) – Yakk

+0

+1은 새로운 게재 위치를 가리 킵니다. 나는 이것을 알아야했다. – xis

+0

고마워, 나는 주로 새로운 게재 위치와 관련된 문제라고 생각합니다. 실제 메모리 할당은 ** SetSizeInternal() ** 라인에서 realloc 호출로 수행됩니다. 그래서 새로운 것은 ** TYPE **의 생성자를 호출하는 것입니다. – Lycoress

3

:: new는 글로벌에서 새 연산자, 즉 표준 new 연산자가 호출되도록합니다. 참고 :: before new는 전역 범위를 나타냅니다.