第一次写这里。我见过像我这样的其他几个问题,但无法解决我的问题。我有4个班:歌曲,播放列表,专辑,艺术家。播放列表由一系列歌曲组成。专辑继承了播放列表并且具有更多的功能,艺术家由专辑和其他一些内容组成。
Album(char* _name, Song* songs,int _sales ,int _year,int n):Playlist(songs,n)
{
name = new char[strlen(_name)+1];
strcpy(name,_name);
salesCount=_sales;
year = _year;
};
Playlist::Playlist(Song* _songlist, int n)
{
if(n > 20)
{
cout<<"The number of song must be lesser or equal to 20"<<endl;
return;
}
SongList = new Song[n];
for(int i = 0 ; i<n; i++)
{
SongList[i] = _songlist[i];
}
numberOfSongs=n;
}
当我使用这个构造函数创建一个专辑时,我没有任何问题,但是当我尝试创建一个专辑数组,其中包含使用此construtor创建的专辑时,我会遇到内存访问冲突。有任何想法吗 ?
好的,所以我稍微更新了我的代码。以下是我在主方法中要做的事情:
Song newSong("My Song", 9, 231),mySong("Your Song", 8 , 180),yourSong("His Song",7,135), herSong("Her Song",8,431);
Song songs[4] = {newSong, mySong,yourSong,herSong};
Album yourAlbum("My Album",songs,200000, 2010, 4);
yourAlbum.PrintInfo(); //<------- WORKS
Album albums[1]; //<------ It calls the deffault constructor of Album and after it gives me //"Source not available"
//When I try to declare it like this Album albums[1] = { yourAlbum } ; it gives me access violation
Artist myArtist("blake", albums);
myArtist.PrintArtistInfo();
答案 0 :(得分:4)
Playlist::Playlist(Song* _songlist) {
numberOfSongs = sizeof(*_songlist)/sizeof(_songlist); // <-- THIS
...
会导致意外(无意义)值分配给numberOfSongs
,因为它等于:
numberOfSongs = sizeof(Song) / sizeof(Song*);
如果你需要你的函数来知道动态分配的数组的大小,你应该自己跟踪这个大小并将它传递给这个函数。
另请注意,由于您使用C ++编程,因此应使用此语言提供的功能。您应该使用std::string
而不是C风格的字符串和STL容器(例如std::vector
而不是C风格的数组(在std::vector
的情况下),对象内部保存有关其长度的信息,所以你不会处理这类问题。)
答案 1 :(得分:0)
这里的问题是你正在分配一个sizeof(*_songlist)/sizeof(_songlist);
元素的数组。
也就是说,您分配的Song
项的数量等于用于存储Song
的字节数除以用于存储指针的字节数(到{ {1}})。这是一个相当无意义的价值。
此外,此数字是一个常数值,不依赖于您传递的数组中的歌曲数量。因此,无论传递什么,此函数的任何运行都将始终分配相同数量的内存。如果此数字大于实际传递的歌曲数,您将在数组外部进行索引,这是未定义的行为。这可以解释你的分段错误。
另一方面,如果您传递的歌曲数量超过此常量,则会使用适合您分配的数组的歌曲子集初始化数组,从而丢失一些数据。要解决这个问题,要么传递一个(引用一个)std :: vector of songs,要么添加一个包含数组中实际歌曲数量的额外参数,并将其用作数组的大小。