2015-01-10 2 views
0

Недавно я заметил, что мой Двигатель абсолютно неоптимизирован, поэтому я решил сделать небольшую очистку. После реализации некоторых алгоритмов отбраковки я открываю диспетчер задач Windows, чтобы узнать, сколько моего приложения использует память. В результате моих коротких исследований о «новых» и «удаленных» операторах я попытался использовать их для более эффективного использования памяти. Например:Почему удаление оператора приводит к отказу отладки в режиме отладки?

void DrawSkybox() 
{ 
p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 
D3DXVECTOR3* Scal = new D3DXVECTOR3(1.5f, 1.5f, 1.5f); 
D3DXVECTOR3* Rot = new D3DXVECTOR3(0, 0, 0); 
obj_Skybox->Transform(&vec3_camera_viewPos, Scal, Rot); 
DrawObject(p_Device, obj_Skybox, NULL, NULL, NULL, false); 
p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 
delete Scal; 
delete Rot; 
} 

В первый раз, когда я компиляции и запуска Отладочная версия двигателя я получил ошибку: «Debug Assertion Failed». Затем я скомпилировал и выполнил мой движок в качестве выпуска - все в порядке. Так в чем проблема?

+3

Почему бы вам просто не создать эти экземпляры в стеке, например 'D3DXVECTOR3 Scal (1.5f, 1.5f, 1.5f);'? Я не вижу необходимости использовать 'new' /' delete'here вообще. ' –

+1

Возможно, потому, что вы делаете что-то плохое с памятью, например, записываете за пределы или что-то еще, что, вероятно, приводит к [неопределенному поведению] (http : //en.wikipedia.org/wiki/Undefined_behavior)? –

+2

Если вы уже переформатируете свой код на C++, почему бы не переключиться на использование современного управления памятью стиля RAII? Вы будете удивлены, сколько проблем просто исчезнет *. – 5gon12eder

ответ

0

Вам лучше следует реорганизовать свой код таким образом, вместо того, чтобы хлопотать о new и delete:

void DrawSkybox() { 
    p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 
    D3DXVECTOR3 Scal(1.5f, 1.5f, 1.5f); // <<<< Just use stack 
    D3DXVECTOR3 Rot (0, 0, 0);   // <<<< allocated variables ... 
    obj_Skybox->Transform(&vec3_camera_viewPos, &Scal, &Rot); // <<< ... and pass 
                   // their addresses 
    DrawObject(p_Device, obj_Skybox, NULL, NULL, NULL, false); 
    p_Device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 
} 

Я не могу сказать больше подробностей о том, что фактический провал утверждения вы получите, но это встречающийся в режиме отладки только, и скомпилированный код режима освобождения не заметит, что происходит.
Ошибки, похоже, связаны с чем-то другим в вашем коде в другом месте, но не должны просто вводить операторы delete.

+0

Спасибо, результат замены нового оператора временными переменными значительно сокращает использование памяти! Также память перестает увеличиваться каждую секунду и сейчас работает и выделяет стабильную. – Ocelot

+0

Ваш исходный код подразумевает, что вы пришли из C#, где этот шаблон является общим. В C++ '' new'' не является «дешевым», как на C#, где нет сборки мусора. Вы должны потратить некоторое время на изучение книги на C++, чтобы понять разницу между «автоматическими» переменными в стеке, памятью с кучей и другими аспектами модели памяти C++. –

+0

@ChuckWalbourn Ты абсолютно прав, я пришел из C#, чтобы опробовать управляемый dx. – Ocelot

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