我有以下代码。它编译得很好,但它告诉我字符串是“E# ^ $ $ @ $$$$$$$”。 有什么想法吗?
ifstream InFile(Filename);
if (!InFile)
return false;
std::string Name;
Song *pSong;
for (int a = 0; a < Playlist.size(); a++)
{
delete Playlist[a];
}
Playlist.clear();
while (true)
{
if (!InFile)
break;
pSong = new Song();
std::getline(InFile, Name, '\n');
pSong->File = const_cast<char*>(Name.c_str());
std::getline(InFile, Name, '\n');
pSong->Volume = atof(Name.c_str());
Playlist.push_back(pSong);
}
播放列表:std::vector<Song*>Playlist;
答案 0 :(得分:3)
这是有问题的一行。
pSong->File = const_cast<char*>(Name.c_str());
您正在存储指向内存的指针,该指针在您从文件中读取下一行文本后无效。
将其更改为:
pSong->File = strdup(Name.c_str());
如果您的平台没有strdup
,这是一个简单的实现。
char* strdup(char const* s)
{
char* ret = malloc(strlen(s)+1);
strcpy(ret, s);
return ret;
}
<强>注意强>
由于在使用strdup
时分配内存,因此必须确保取消分配内存。
您可以选择使用new
来分配内存,因为您使用的是C ++。如果使用new
分配内存,则必须使用delete
来释放内存。如果使用malloc
分配内存,如本答案中所示,则必须使用free
来释放内存。