Microsoft C++例外:标准::bad_alloc.可能是什么原因造成的

Microsoft C++ exception: std::bad_alloc. What could be causing it?

本文关键字:是什么 alloc 例外 C++ 标准 bad Microsoft      更新时间:2023-10-16

我昨晚处理的相同代码抛出了一个全新的错误。我以前从未遇到过,我正在考虑向我的 PC 扔东西。但是,昨晚这里的每个人都非常乐于助人,所以我想看看是否有人对这个新问题有任何想法。

有些东西导致了"Microsoft C++例外:std::bad_alloc",我认为它在主.cpp的第一行,但这只是将玩家创建为英雄(生物之子)职业。我不明白为什么它做不到。

我知道这可能是一些愚蠢的事情,我做得不好......但任何帮助将不胜感激!

//main.cpp
#include "Creature.h"
#include "Hero.h"
#include "Monster.h"
#include <conio.h>
using namespace std;
int main()
{
    Hero player(1);
    Monster baddie;
    player.setX(1);
    player.setY(1);
    baddie.setX(20);
    baddie.setY(20);
    player.Display();
    baddie.Display();
    baddie.chase(player);
    player.Display();
    baddie.Display();
    _getch();
    return 0;
}

===================================
//Creature.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Creature
{
protected:
    int m_xpos;
    int m_ypos;
    string m_name;
public:
    Creature(string name, int xpos, int ypos);
    void Display(void);
    void left(void);
    void right(void);
    void up (void);
    void down(void);
    void setX(int x);
    void setY(int y);
    int getX(void);
    int getY(void);
};

===================================
//monster.h
#pragma once
#include "Creature.h"
class Monster : public Creature
{
public:
    Monster();
    void chase(class Hero);
    bool eaten(class Hero);
};
===================================
//Hero.h
#pragma once
#include "Creature.h"
class Hero : public Creature
{
private:
    int m_lives;
    int m_score;
public:
    Hero(int lives);
    void Display(void);
    void setScore(void);
};
===================================
//creature.cpp
#include "Creature.h"
Creature::Creature(string name, int xpos, int ypos)
{
    m_xpos = xpos;
    m_ypos = ypos;
    m_name = name;
}
void Creature::Display(void)
{
    cout << m_name << endl;
    cout << m_xpos << endl;
    cout << m_ypos << endl;
}
void Creature::left(void)
{
    m_xpos = m_xpos+1;
}
void Creature::right(void)
{
    m_xpos = m_xpos-1;
}
void Creature::up(void)
{
    m_ypos = m_ypos-1;
}
void Creature::down(void)
{
    m_ypos = m_ypos+1;
}
void Creature::setX(int x)
{
    m_xpos = x;
}
void Creature::setY(int y)
{
    m_ypos = y;
}
int Creature::getX(void)
{
    return m_xpos;
}
int Creature::getY(void)
{
    return m_ypos;
}
===================================
//Hero.cpp
#include "Creature.h"
#include "Hero.h"
Hero::Hero(int lives) : Creature(m_name, m_xpos, m_ypos)
{
    m_lives = lives;
}
void Hero::Display(void)
{
    Creature::Display();
    cout << "Lives: " << m_lives << endl;
    cout << "Score: " << m_score << endl;
}
void Hero::setScore(void)
{
    m_score = 0;
}
===================================
//Monster.cpp
#include "Creature.h"
#include "Monster.h"
#include "Hero.h"
Monster::Monster() : Creature(m_name, m_xpos, m_ypos)
{
}
void Monster::chase(Hero hero)
{
    if(getX() < hero.getX())
    {
        right();
    }
    if(getX() > hero.getX())
    {
        left();
    }
    if(getX() < hero.getX())
    {
        down();
    }
    if(getX() >hero.getX())
    {
        up();
    }
}
bool Monster::eaten(Hero hero)
{
    if((getX() == hero.getX())&&(getX() == hero.getX()))
    {
        return true;
    }
}

===================================

问题在于Hero::Hero(int lives) : Creature(m_name, m_xpos, m_ypos)以及与怪物.cpp文件的等价。

将它们更改为Hero::Hero(int lives) : Creature("", 0,0)解决了内存问题。

再次感谢一个很棒的社区!

希望您再也不会看到此代码!(手指交叉!

错误出在以下行上:

Hero::Hero(int lives) : Creature(m_name, m_xpos, m_ypos)

不能通过将子对象自己的未初始化数据成员传递给Creature子对象来创建该子对象。您需要将某种有效值传递给基类构造函数,例如Creature("", 0, 0)

该错误是由尝试复制未初始化的std::string对象引起的。