C++。vector 在添加新元素时随机调用类的析构函数。
有一个类并立即创建该类的一个向量
class Mp3Window
{
public:
float Balans;
float Volume;
bool Init;
Mp3Window()
{
Init = 0;
Balans = 0;
Volume = 0;
}
HSAMPLE sample;
HCHANNEL channel;
std::string SubName;
std::string URL;
//DevChBTG::OBGECT Procces;
int idObject;
int idPlay;
int idPause;
int idGrup;
int idTextKey;
char key;
int Temp;
~Mp3Window()
{
{
BASS_ChannelStop(channel);
BASS_StreamFree(channel);
}
}
};
std::vector<Mp3Window>MusMAs;
这是添加新元素的代码
{
Mp3Window W;
MusMAs.push_back(W);
}
int id = MusMAs.size()-1;
MusMAs[id].idGrup = ID1;
MusMAs[id].idObject = GUI.FindIdObject("CoPres1track",ID1);
MusMAs[id].idPause = GUI.FindIdObject("CoPres1Pause",ID1);
MusMAs[id].idPlay = GUI.FindIdObject("CoPres1Play",ID1);
MusMAs[id].idTextKey = GUI.FindIdObject("CoPres1key",ID1);
MusMAs[id].URL = URL;
MusMAs[id].Init = true;
GUI.mObgects[MusMAs[id].idTextKey].Text = "";
//nameMP3->Text = utf8_encode( utf8_decode(S).c_str());
MusMAs[id].sample = MUS;
MusMAs[id].channel=BASS_SampleGetChannel(MusMAs[id].sample, FALSE);
//BASS_ChannelPlay(MusMAs[MusMAs.size()-1].channel, FALSE); //Запуск в начале
结果,当一个新元素添加到旧元素时,调用析构函数并删除歌曲;图为失去访问歌曲的结果(变量)
如何在不评论析构函数的情况下使一切正常


如果将元素添加到向量并且其容量不足 (
.capacity()) - 它会在堆上分配新的内存块(更大的大小),将元素移动到其中(调用移动或复制构造函数),并删除旧块。当旧的内存块被删除时,会在其中的对象上调用析构函数。
您的问题是因为它
Mp3Window违反了三/五/零规则 (俄语) - 如果您向类添加自定义析构函数,您还必须添加正确的复制构造函数和赋值运算符(“三”)。如果类不能按含义复制,则至少必须将其删除(=delete)。在某些情况下,还需要移动构造函数和赋值运算符(“五”)。或者,如果这很困难,那么锁定类的复制/移动:
现在向量将拒绝存储这样的类。
相反,您可以采取例如
std::list不需要复制元素的方式。