我一直在我的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();
};