SFML析构函数与删除数组有关

时间:2015-08-17 19:01:02

标签: c++ arrays sfml delete-operator

我一直在处理我的spaceInvaders克隆,我现在正试图通过清理内存泄漏来完成项目。

目前我正在尝试删除在构造函数中创建的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();



};

2 个答案:

答案 0 :(得分:1)

new来电与您的delete来电相匹配。

delete *alienRow;

此处没有匹配的new。您有效地删除了数组的第一个元素12次。删除此行。

delete [] alienRow;

您的数组不是使用new创建的。也删除此行。

答案 1 :(得分:0)

使用智能指针和(unique_ptr或shared_ptr),您不必删除它们。