2013-01-03 5 views
4

При изучении MS DirectX 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; 
} 

Это можно найти в DXUTmisc.h на линии 428 на моей версии DXSDK (June2010). Мне интересно об этом :: new вещь .... Я пытаюсь Google и поиск в переполнении стека, но кажется, что поисковый движок отбрасывает два двоеточия, когда я набираю «:: new» в строке поиска. ...

+1

'::' является [оператором разрешения области] (http://en.wikipedia.org/wiki/Scope_resolution_operator) и сам по себе указывает глобальную область действия. Он гарантирует, что 'new' вызывается из глобальной области. – Joe

ответ

10

Звонок ::new означает, что программа пытается использовать глобальный оператор new для распределения пространства, а не с использованием любого оператора new, который был определен в классе или пространстве пространства имен. В частности, этот код пытается использовать что-то, называемое placement new, в котором создаваемый объект помещается в определенное место в памяти. Благодаря явным вызовом резервного копирования в глобальную область функция гарантирует, что это правильно использует новое место размещения и не случайно вызывает другую функцию распределения, введенную где-то в цепочке областей видимости.

Надеюсь, это поможет!

+0

+1 для указания вопроса XY. (Они спросили X, но действительно нужно было знать Y) – Yakk

+0

+1 для указания места размещения нового. Я должен был это заметить. – xis

+0

Спасибо, я думаю, что это в основном проблема с размещением нового. Фактическое выделение памяти выполняется в строке ** SetSizeInternal() ** с вызовом realloc. Таким образом, новое здесь просто для того, чтобы называть ** TYPE ** конструктором, если он есть. – Lycoress

3

:: new гарантирует, что будет вызываться новый оператор на глобальном, т.е. стандартный новый оператор. Примечание :: before new указывает глобальную область.

Смежные вопросы