删除另一个类的类实例时堆损坏

0 c++

(c ++课程问题)

这真的让我失望,当下面的类删除其成员指针(对类播放器)的析构函数时,我得到一个'正常阻塞后的堆损坏'错误.

//Team.h
class Team
{
public:
    Team (const char* team_dir_path);
    ~Team(void);

    Team (const Team &team);

    Player* player;
    int player_cnt;
};

//Team.cpp

Team::Team( const char* team_dir_path )
{
    player = 0;
    player_cnt = 0;

    std::string* name;
    int* body;
    int* mind;
    int* speed;
    int* health;
    int* item;

    std::ifstream infile;
    infile.open( team_dir_path );
    if (infile.is_open())
    {
        infile >> player_cnt;

        if (player_cnt)
        {
            name = new std::string [player_cnt];
            body = new int [player_cnt];
            mind = new int [player_cnt];
            speed = new int [player_cnt];
            health = new int [player_cnt];
            item = new int [player_cnt];

            player = new Player[ player_cnt];


            for (int i=0; i<player_cnt; i++)
            {
                infile >> name[i] >> body[i] >> mind[i]
                       >> speed[i] >> health[i] >> item[i];
            }

            infile.close();

            for (int i=0; i<player_cnt; i++)

            {
                player[i].name = name[i];
                player[i].set_stat( BODY, body[i] );
                player[i].set_stat( MIND, mind[i] );
                player[i].set_stat( SPEED, speed[i] );
                player[i].set_stat( HEALTH, health[i] );
                player[i].set_stat( ITEM, item[i] );
            }

            delete [] name;
            delete [] body;
            delete [] mind;
            delete [] speed;
            delete [] health;
            delete [] item;
        }
    }
}

Team::~Team(void)
{
    if (player){ delete [] player;}
}

Team::Team (const Team &team)
{
    this -> player = new Player;
    this -> player_cnt = 0;
}

//Player.h
class Player
{
public:
    Player(void);
    ~Player(void);

    void set_stat (const int which, const int value){ stat[which] = value;}
    void assign_stat (const int which, const int value){ stat[which] += value;}
    int get_stat (const int which){ return stat[which];}

    std::string name;

private:    

    // BODY;MIND;SPEED;HEALTH;ITEM.

    int stat[ MAXSTAT ];
};

//Player.cpp
Player::Player(void)
{
}

Player::~Player(void)
{
}

// Main.cpp
int main()
{
    initscr();
    cbreak();
    noecho();  

    Team* team1 = 0;
    Team* team2 = 0;

    team1 = new Team("c:\\IB\\ib\\teams\\bombers.txt");
    team2 = new Team("c:\\IB\\ib\\teams\\maruaders.txt");

    refresh();
    napms(1000);

    if (team1){ delete team1;}
    if (team2){ delete team2;}

    endwin();
}
Run Code Online (Sandbox Code Playgroud)

所以每当......

if (player){ delete [] player;}
Run Code Online (Sandbox Code Playgroud)

在类析构函数中到达我得到堆损坏错误.

请帮忙.

Ale*_*lli 14

虽然C++没有正式区分这些情况,但你需要区分指向单个玩家的指针和一个指向一组玩家的指针,因为它们不能以相同的方式删除.在你的代码中,你有两个:

player = new Player[ player_cnt];
Run Code Online (Sandbox Code Playgroud)

玩家指向一个数组,这适合你的析构函数

delete [] player;
Run Code Online (Sandbox Code Playgroud)

但是,还有,在你的ctor:

this -> player = new Player;
Run Code Online (Sandbox Code Playgroud)

这使得玩家指向单个玩家,从而使得delete []玩家不正确.

  • 正确的,我自己要发布这个帖子...但是我无法看到示例代码中将调用copy ctor的位置,所以我不知道这是否能解决askers特定问题.+1反正:) (2认同)