获取错误"terminate called after throwing an instance of 'std::bad_alloc' what(): std::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

注意:我在这里发布答案,这样就不必为了找到答案而浏览评论了。

在函数"中;addSong"来自artist.cpp:

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

您正在传递对象的";这个";指针。每个对象都有自己的";这个";提供对其自身存储器地址的访问的指针。点击此处了解更多信息: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_aartist((。

该参数不会反映您传入的指向对象内存地址的指针。此外,由于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

我希望这能有所帮助!

相关内容

最新更新