2014-12-27 1 views
1

글 머리 기호 클래스가 있습니다. 그리고 다음 코드로 인스턴스화하려고 시도합니다 :마멀레이드 SDK를 사용하는 메모리 사용 문제

나는 항상 사용중인 메모리가 있다는 주장을합니다. 왜?

for (list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end();) 
{ 
    (*it)->Update(dt); 

    if ((*it)->IsDestroyed) 
    { 
     Canfire = true; 
     it = Bullets->erase(it); 
    } 
    else 
    { 
     it++; 
     Canfire = false; 

    } 

} 

선박 클래스

Ship::~Ship() 
{ 
    for (std::list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end(); ++it) 
     delete *it; 
    delete Bullets; 

} 

class Bullet 
{ 
public: 
    Bullet(); 
    ~Bullet(); 
public: 
    void Init(BulletTypes bulletType); 
    void Update(float dt); 
    void Render(); 
    CIw2DImage*  Image;    // curr image 
} 

void Bullet::Init(BulletTypes bulletType) 
{ 
    BulletType = bulletType; 
    if (BulletType == SHIP_BULLET) 
    { 
     Image = Iw2DCreateImage("textures/ship_bullet.png"); 
     if (Image == nullptr) 
     return; 

    } 
} 
Bullet::~Bullet() 
{ 
    delete Image; 
} 
+0

글 머리 기호는 한 번에 한 번만 쓰고 * 한 번만 * 이미지를로드해야합니다. – nvoigt

+0

@nogigt하지만 디자인을 변경하려면 어떻게해야합니까? – andre

+0

** 게시물을 ** 수정하고받은 _exact_ 오류 메시지와 오류를 일으키는 도구 (컴파일러, valgrind, Visual Leak Detector 등)를 포함하십시오. –

답변

0

의 소멸자가 실행 : 이것은 사용에 여전히 메모리를 야기 각 프레임이라고

if (g_Input.isKeyDown(s3eKeySpace))// && Canfire) 
     { 
      Bullet *bullet = new Bullet(); 
      bullet->Init(SHIP_BULLET); 
      bullet->setPosition(Position.x, Position.y - 20); 
      Bullets->push_back(bullet); 
      Canfire = false; 

     } 

: 다른 클래스라는 배에서

이 코드는 누수의 원인이됩니다.

for (list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end();) 
{ 
    (*it)->Update(dt); 

    if ((*it)->IsDestroyed) 
    { 
     Canfire = true; 
     it = Bullets->erase(it); 
    } 
    else 
    { 
     it++; 
     Canfire = false; 
    } 
} 

기본적으로 컨테이너에서 동적으로 할당 된 요소를 제거하여 참조를 잃어 버리면 더 이상 메모리를 확보 할 수 없습니다. Ship 소멸자를 호출하면 현재 반복 목록에서 제거 된 요소를 제외하고 목록에있는 요소 만 해제됩니다.

나는 수정으로이 제안 :

for (list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end();) 
{ 
    (*it)->Update(dt); 

    if ((*it)->IsDestroyed) 
    { 
     Canfire = true; 
     delete *it; // it now points to invalid address 
     it = Bullets->erase(it); 
    } 
    else 
    { 
     it++; 
     Canfire = false; 
    } 
} 

또 다른 옵션이 파괴 된 후 총알이 참조 할 수있는 경우 클래스 선박에서 다른 컨테이너에서 제거 된 모든 총알을 저장하는 것입니다. 이 아이디어의 문제점은 메모리를 차지하는 파괴 된 총알을 많이 가지고 있으며 실제로 쓸모가 없으면 제거하는 방법에 대한 해결책을 제시해야한다는 것입니다.

만약 문제가 있다면, 목록에서 원시 포인터 대신 std :: shared_ptrs를 사용하면 문제가 해결 될 수 있습니다 (약간의 성능 저하).