티스토리 뷰

게임 개발을 하다 보면 총알이나 파티클 등을 구현하기 위해 list 구조를 사용할 때가 있는데

총알이나 파티클은 개수가 동적이기 때문에 메모리를 동적할당하여 구현한다.


bullet을 구현한다고 할 때 아래처럼 구현할 수 있다.


std::list<Bullet*> _bullets;

 

// 총알이 발사될 때 마다

Bullet* bullet = new Bullet();

_bullets.push_back(bullet);






나중에 필요에 의해 bullet을 삭제해야 한다면 그냥 erase()를 사용해서 삭제하면 메모리 누수가 일어난다.

erase()는 동적할당한 메모리를 지우는 것이 아니라 해당 노드를 지우는 것이기 때문에 노드가 가리키는 메모리를 해제시키지 않는다.


따라서 아래처럼 삭제해야 한다.


// 특정 노드를 삭제해야 한다면

void EraseBullet(Bullet* bullet){

for each(Bullet* b in _bullets){

if(b == bullet){

delete b;

_bullets.erase(b);

}

}

}

 

// 리스트 전체를 삭제해야 한다면

void EraseBullets(){

for each(Bullet* bullet in _bullets){

delete bullet;

}

_bullets.clear();

}


위처럼 메모리를 해제하는 코드를 작성해야 실질적인 메모리가 해제되어 메모리 누수가 발생하지 않는다.





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함