2015-09-29 3 views
0

У меня это как частный член класса.Как я могу правильно освободить ID3D11ShaderResourceView **, чтобы избежать утечек памяти?

ID3D11ShaderResourceView** texture_pool; 

Я поставил его в NULL в конструкторе класса, как это:

texture_pool = NULL; 

Тогда я инициализировать его, как это в инициализации класса:

texture_pool = new ID3D11ShaderResourceView*[texture_count]; 
for (int n = 0; n < texture_count; n++) texture_pool[n] = NULL; 

А в классе деструктор I отпустите его следующим образом:

for (int n = 0; n < texture_count; n++) SAFE_RELEASE(texture_pool[n]); 
SAFE_DELETE_ARRAY(texture_pool); 

Но иногда моя программа падает, когда я выйти из нее и точки debbuger на этой линии в качестве причины аварии:

for (int n = 0; n < texture_count; n++) SAFE_RELEASE(texture_pool[n]); 

Если удалить эту строку все работает гладко, но я беспокоюсь о возможных утечках памяти, если Я не выпускаю массив.

Итак, могу ли я просто удалить эту линию, и все будет очищено porperly?

Эти являются определенные линии для выпуска и удаления инструкции:

#define SAFE_RELEASE(p) { if ((p)) { (p)->Release(); (p) = 0; } } 
#define SAFE_DELETE(a) if((a) != NULL) delete (a); (a) = NULL; 
#define SAFE_DELETE_ARRAY(a) if((a) != NULL) delete[] (a); (a) = NULL; 
+0

Вы пытались использовать ваш отладчик для входа в код, чтобы увидеть, где он находится в цикле вашего деструктора? Возможно, ваша реализация написана правильно, но вы можете попытаться выпустить то, что недействительно во время вызова деструктора. –

+0

Я также заметил что-то о ваших макросах, вы можете обратиться к приведенному ниже ответу, чтобы узнать, устраняет ли это вашу проблему. –

ответ

1

Вы показали это:

#define SAFE_RELEASE(p) { if ((p)) { (p)->Release(); (p) = 0; } } 
#define SAFE_DELETE(a) if((a) != NULL) delete (a); (a) = NULL; 
#define SAFE_DELETE_ARRAY(a) if((a) != NULL) delete[] (a); (a) = NULL; 

Попробуйте вместо этого:

#ifndef SAFE_RELEASE 
    #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p) = NULL; } } 
#endif 

#ifndef SAFE_DELETE 
    #define SAFE_DELETE(p) { if(p) { delete (p); (p) = nullptr; } } 
#endif 

#ifndef SAFE_DELETE_ARRAY 
    #define SAFE_DELETE_ARRAY(p) { if(p) { delete[](p); (a) = nullptr; } } 
#endif 

При работе с макросами вам нужно быть осторожным с использованием «()« & «{}".

Вам также не нужно (p)! = Проверка nullptr, поскольку, если у вас есть (p), он будет выполнять только следующую инструкцию, если эта проверка возвращает значение true, указывающее, что указатель действителен, а не null.

Вам также не хватает #ifndef и #endif вокруг определений макросов.

Если ваш компилятор не поддерживает nullptr, тогда вы можете использовать NULL, но nullptr намного чище и удобочитаемо.

+0

@Haalef сообщите мне, если это исправляет вашу проблему или нет, поэтому мы можем перейти оттуда, чтобы убедиться, что вы хотите, чтобы DirectX Release недействительный объект или нет. –

+0

Спасибо @Francis Cugler, ваш код намного чище и должен избегать возможных проблем с использованием защит #ifndef и #endif. Однако это не устранило проблему. Самое забавное, что все работает нормально, когда я запускаю обе версии отладки или выпуска внутри визуальной студии, но при выходе из нее происходит сбой при выполнении сгенерированного файла .exe непосредственно в операционной системе. Что я сделал для решения этой проблемы, так это то, что теперь я использую вектор в качестве контейнера для массива и очищаю каждый элемент деструктора, как я это делал раньше, он, похоже, устранил проблему.Сейчас работает отлично. – Haalef

+0

Приятно видеть, что вы нашли решение, которое работает. Это было бы моим следующим предложением, чтобы использовать вектор, прикрепленный к массиву. –

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