2015-08-17 42 views
0

我一直在我的spaceInvaders克隆工作,我現在試圖清理內存泄漏完成項目。SFML析構函數問題與刪除數組

當前我試圖刪除在構造函數中創建的11 aliensobjects的數組,但是這樣做時程序會在AlienRow的析構函數處中斷(崩潰)。

我已經試過了以下幾件事:

創建nullpointers在構造函數,並刪除了與此:

for (int i = 0; i < 11; i++) 
    { 
     if (alienRow[i] != nullptr) 
     { 
      delete alienRow[i]; 
     } 
     delete *alienRow; 

還有: delete [] alienRow;

任何指針爲什麼會出現這個問題?

#include "AlienRow.h" 

AlienRow::AlienRow(float x, float y, int type){ 
    for (int i = 0; i < 11; i++) 
    { 
     alienRow[i] = nullptr; 
    } 
    if (type == 1){ 

     for (int i = 0; i < 11; i++) 
     { 
      alienRow[i] = new Alien(x, y, "Alien1.png"); 
      x = x + 70; 
     } 
    } 
    if (type == 2){ 

     for (int i = 0; i < 11; i++) 
     { 
      alienRow[i] = new Alien(x, y, "Alien2.png"); 
      x = x + 70; 
     } 
    } 
    if (type == 3){ 

     for (int i = 0; i < 11; i++) 
     { 
      alienRow[i] = new Alien(x, y, "Alien3.png"); 
      x = x + 70; 
     } 
    } 

} 

AlienRow::~AlienRow(){ 
    /*for (int i = 0; i < 11; i++) 
    { 
     if (alienRow[i] != nullptr) 
     { 
      delete alienRow[i]; 
     } 
     delete *alienRow; 
    }*/ 

    delete [] alienRow; 
} 


void AlienRow::draw(RenderTarget& target, RenderStates states)const{ 

    for (int i = 0; i < 11; i++) 
    { 
     target.draw(*alienRow[i]); 
    } 


} 

Alien* AlienRow::getAlienRowA(int nr)const{ 
    return alienRow[nr]; 
} 


bool AlienRow::getAlienMove(float x, float y){ 
    for (int i = 0; i < 11; i++) 
    { 
     if (alienRow[i]->moveAlien(x, y) == true) 
      return true; 
    } 
    return false; 
} 



#pragma once 
#include "Alien.h" 
#include <iostream> 


class AlienRow :public sf::Drawable { 

private: 
    Alien* alienRow[11]; 

    float alienVelocity; 

public: 
    Alien* getAlienRowA(int nr)const; 
    virtual void draw(RenderTarget& target, RenderStates states)const; 

    bool getAlienMove(float x, float y); 
    AlienRow(float x, float y, int type); 
    ~AlienRow(); 
}; 

外國人:

#include "Alien.h" 
#include <iostream> 

Alien::Alien(float x, float y, std::string alien){ 

    alienTexture.loadFromFile(alien); 
    alienSprite.setTexture(alienTexture); 
    alienSprite.setPosition(x, y); 
    alienSprite.setScale(sf::Vector2f(0.7f, 0.7f)); 


} 

Alien::~Alien(){ 

} 


void Alien::draw(RenderTarget& target, RenderStates states)const{ 

    target.draw(alienSprite); 
} 

void Alien::update(float dt){ 

} 

Sprite Alien::getAlienSprite()const{ 
    return alienSprite; 
} 

void Alien::moveDeadSprite(){ 
    alienSprite.setPosition(alienSprite.getPosition().x, alienSprite.getPosition().y - 700); 
} 

bool Alien::moveAlien(float x, float y){ 
    alienSprite.move(x, y); 
    if (alienSprite.getPosition().y > 540){ 
     return true; 
    } 

    return false; 

} 

#pragma once 
#include "Entity.h" 

class Alien:public Entity{ 

private: 
    Sprite alienSprite; 
    Texture alienTexture; 

    float velocity; 

public: 
    Sprite getAlienSprite()const; 

    void moveDeadSprite(); 
    bool moveAlien(float x, float y); 

    virtual void draw(RenderTarget& target, RenderStates states)const; 
    virtual void update(float dt); 
    Alien(float x, float y, std::string alien); 
    virtual ~Alien(); 



}; 

異形叢生

#include "AlienSwarm.h" 

AlienSwarm::AlienSwarm(float y){ 

     aRow[0] = new AlienRow(0,y,3); 
     y = y + 50; 
     aRow[1] = new AlienRow(0,y,2); 
     y = y + 50; 
     aRow[2] = new AlienRow(0, y,3); 
     y = y + 50; 
     aRow[3] = new AlienRow(0, y,2); 
     y = y + 50; 
     aRow[4] = new AlienRow(0, y,1); 
     y = y + 50; 

} 

AlienSwarm::~AlienSwarm(){ 
    for (int i = 0; i < 5; i++) 
    { 
     delete aRow[i]; 
    } 
} 


void AlienSwarm::draw(RenderTarget& target, RenderStates states)const{ 

    for (int i = 0; i < 5; i++){ 

     target.draw(*aRow[i]); 
    } 

} 

AlienRow* AlienSwarm::getAlienSwarmA(int nr)const{ 
    return aRow[nr]; 
} 

void AlienSwarm::update(){ 


} 

bool AlienSwarm::getAlienMoveRow(){ 
    for (int i = 0; i < 5; i++) 
    { 
     if (aRow[i]->getAlienMove(0, 0.5f) == true) 
      return true; 
    } 
    return false; 
} 

#pragma once 

#include "AlienRow.h" 

class AlienSwarm:public Drawable{ 

private: 
    AlienRow* aRow[5]; 
    float y; 
public: 
    AlienRow* getAlienSwarmA(int nr)const; 

    bool getAlienMoveRow(); 

    virtual void draw(RenderTarget& target, RenderStates states)const; 
    virtual void update(); 
    AlienSwarm(float y); 
    virtual ~AlienSwarm(); 



}; 

回答

1

彰顯new撥打您的電話delete

delete *alienRow; 

對此沒有匹配的new。您有效地刪除陣列的第一個元素12次。刪除這一行。

delete [] alienRow; 

您的數組不是使用new創建的。刪除這一行。

0

使用智能指針和(unique_ptr或shared_ptr),您不必刪除它們。