得到错误“抛出'std :: bad_alloc'what():whatstd :: bad_alloc实例后终止调用”

神秘感

这是我关于Stackoverflow的第一篇文章,希望我能找到解决问题的方法。

这是班级歌曲的主要内容,它获取元数据(长度,年份,类型)。我认为问题出在函数enumToString,但我不确定:/

Song::Song(Artist artist, string title)
{
    an_artist = &artist;
    a_title = title;
}


Artist Song::artist() const
{
    return *an_artist;
}

void Song::artist(Artist artist)
{
    an_artist = &artist;
}

string Song::title() const
{
    return a_title;
}

void Song::title(string title)
{
    a_title = title;
}

Metadata *Song::metadata()
{
    return &a_metadata;
}

// converting enum to string
const string enumToString (Genre val)
{
    switch (val)
    {
        case Genre::Funk:
            return "Funk";
        case Genre::Soul:
            return "Soul";
        case Genre::Rap:
            return "Rap";
        case Genre::Rock:
            return "Rock";
        case Genre::Unknown:
            return "Unknown";
        default:
            return "Not recognized!";
    }
}

string Song::info()
{
    int minutes = a_metadata.lengthInSeconds / 60;
    int seconds = a_metadata.lengthInSeconds % 60;


    cout << "( "<< a_title << " ) " << "by " << an_artist->name()
                  << " Genre: " << enumToString(a_metadata.a_genre) << ","
                  << " Length: "<< minutes << ":" << seconds << ","
                  << " Published: " << a_metadata.publishedInYear;
    return "";
}

我正在尝试打印歌曲,但是在第一首之后,出现此错误,并且我真的不知道问题出在哪里。这是我第二次使用C ++编码^^预先感谢您

Moez of fawez
fawez : Moez, Sofiene, Rostom, Amine, 

( bara hakeka ) by �>��) Genre: Funk, Length: 15:0, Published: 1980
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
空指针

注意:我将答案发布在这里,这样就不必遍历注释才能找到答案。

在artist.cpp的函数“ addSong”中:

void Artist::addSong(Song *song)
{
    the_songs.push_back(song);
    song->artist(*this); // line I will be referencing
}

您正在传递对象的“ this”指针。每个对象都有其自己的“ this”指针,该指针可访问其自身的内存地址。在此处了解更多信息:https : //www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm

但是在song.cpp的“艺术家”功能中:

void Song::artist(Artist artist)
{
    Artist artistou = artist;
}

旁注:在这种情况下,请使用setter和getter(封装)。即无效set_artist(...)和Artist get_artist()。

该参数不能反映您传入了指向对象内存地址的指针。同样,由于artistou是在此函数内部局部声明和定义的,因此一旦程序离开了此函数的范围,此变量的生命就将留在计算机内存中。此变量应在song.h中定义为:

Artist *artistou = new Artist();

然后再从内存中删除[],就不再使用以避免内存泄漏。

总体而言,请查看有关C ++的一些良好编码实践。正如您所说的那样,我将删除一些重要主题的链接,我认为您可以从学习中受益。

继承:https : //en.cppreference.com/book/intro/inheritance

封装和获取和设置器:https : //www.w3schools.com/cpp/cpp_encapsulation.asp

动态内存管理:https//en.cppreference.com/w/cpp/memory

希望对您有所帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章