int main()
{
srand(static_cast<unsigned int>(time(nullptr)));
Archer* archer = new Archer(new Pet());
archer->_hp = 100;
archer->_maxHp = 100;
archer->_attack = 20;
Knight* knight = new Knight();
knight->_hp = 150;
knight->_maxHp = 150;
knight->_attack = 10;
Arrow* arrows[10] = {};
for (int i = 0; i < 10; i++)
{
// 기사를 타겟으로, 궁수의 공격력을 지닌 상태
Arrow* arrow = new Arrow(knight, archer->_attack);
arrows[i] = arrow;
}
for (int i = 0; i < 10; i++)
{
arrows[i]->AttackTarget();
// 기사가 죽었으면 소멸시켜준다
if (knight != nullptr)
{
if (knight->IsDead())
{
delete knight;
knight = nullptr;
}
}
delete arrows[i];
arrows[i] = nullptr;
}
}
Arrow::Arrow(Player* target, int damage)
: _target(target), _damage(damage)
{
}
Arrow::~Arrow()
{
}
void Arrow::AttackTarget()
{
cout << "화살이 적을 피격합니다!" << endl;
// 공격 대상이 있다면
if (_target != nullptr)
{
// 데미지를 입힌다
_target->AddHp(-_damage);
_target->PrintInfo();
}
}
만약 knight가 데미지를 받고 죽게되어 delete knight 되는 순간 힙영역의 메모리들이 정리가 됨 하지만 Arrow에서 받는 target은 knight가 소멸됐다는 정보가 없음
target에 담겨있는 주소를 따라가 AddHp, PrintInfo를 수행하게 됨 하지만 도착지는 이미 delete되어 아무것도 없는 상태
여기서 AddHp는 크래쉬없이 수행되지만 PrintInfo에서는 크래쉬가 발생