Изучаем С++ создавая игры в ue4 Уилльям Шериф Изучайте программирование С++ с интересным применением реально мира, что позволит вам создавать ваши собственные игры!



Pdf көрінісі
бет144/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   140   141   142   143   144   145   146   147   ...   252
Байланысты:
аа

Ключевое слово delete  
Оператор delete запускает деструктор для объекта, который удалён, как показано в 
следующем коде: 
int main() 

// "динамическое распределение" – используя ключевое слово new! 
Player *player = new Player(); 
delete player; // 
удаление запускает деструктор 
}
 
 


133 | 
С т р а н и ц а
 
 
Вывод этой программы следующий: 
Игрок родился 
Игрок умер 
Итак,  только  “нормального”  (или  “автоматического”,  также  называемые  как  типы 
не-указатели) типа переменные ликвидируются в конце блока, в котором они были 
объявлены.  Тип  указатель  (переменная  объявленная  со  знаком  *  и  ключевым 
словом 
new
) не ликвидируются автоматически, даже когда они выходят из области 
действия. 
Каково  предназначение  этого?  Динамическое  распределение  даёт  вам  контроль 
когда объект создаётся и ликвидируется. Позже это станет более понятно.  
Утечка памяти 
Итак,  динамически  распределённые  объекты,  созданные  со  словом  new,  не 
удаляются автоматически, пока вы напрямую не вызываете delete для них. Тут есть 
риск!  Это  называется  утечка  памяти.  Утечка  памяти  происходит,  когда  объект, 
распределённый со словом new, вообще не удалился. И что может случиться? Если 
много  объектов  в  вашей  программе  распределены  со  словом  new  и  затем  вы 
прекращаете  использовать  их,  то  в  конце  концов,  в  вашем  компьютере  иссякнет 
память из-за утечки памяти.   
Вот нелепый пример программы для демонстрации проблемы: 
#include  
#include  
using namespace std; 
class Player 

string name; 
int hp; 
public: 
Player(){ cout << "
Игрок родился" << endl; } 
~Player(){ cout << "
Игрок умер" << endl; } 
}; 
int main() 

while( true ) // 
продолжается вечно, 

// 
распределение... 
Player *player = new Player(); 
// без delete == Утечка памяти! 

}
 
Эта программа, если  позволить ей запускаться достаточно долго, в конце концов, 
поглотит память компьютера, как показано на следующем скриншоте: 


134 | 
С т р а н и ц а
 
 
 
2 ГБ ОЗУ используется для объектов Player! 
Заметьте,  что  никто  намеренно  не  пишет  программу  с  проблемой  такого  типа  в 
ней!  Проблема  утечки  памяти  происходит  случайно.  Вы  должны  быть 
внимательными  с  вашим  распределением  памяти  и  удалять  (delete)  объекты, 
которые больше не используются.  


Достарыңызбен бөлісу:
1   ...   140   141   142   143   144   145   146   147   ...   252




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет