我有这样你可以从数组中删除一个值,当你这样做时,所有其他值都应该移动,所以数组中没有间隙。在函数运行之后,我想对新数组执行某些操作程序崩溃并且无法找到值。
sectionKey是将被删除的索引。
void Content::DeleteSection(int sectionKey){
int y = 0;
Section * tempArray = new Section[count-1];
for(int i = 0; i < count; i++){
if(i != sectionKey){
tempArray[y] = sections[i];
y++;
}
}
delete[] sections;
sections = tempArray;
}
我使数组变小后崩溃的代码部分。
void Content::Save(Content* content, QString filePath){
QFile file(filePath);
file.open(QIODevice::WriteOnly);
//Format data
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true);
stream.writeStartDocument();
stream.writeTextElement("numberOfSections",QString::number(content->count));
for(int i = 0; i < content->count; i++){
stream.writeStartElement("Section");
stream.writeTextElement("name",content->sections[i].name); // Crasch
stream.writeEndElement();
}
//Save data
stream.writeEndDocument();
}
我得到的错误是
下级因为引发了异常而停止了。
停在thred 0中:异常位于0x65910dbc,代码:0x0000005:读访问违规位于:0x0,flags = 0x0
而且章节由此组成并不多。
class Section
{
public:
Section();
Section(int key);
Section(const Section& other);
~Section();
QString name;
private:
int key;
};
答案 0 :(得分:2)
你显然想要使用动态数组,因此继续使用一个 - std::vector
std::vector<int> vec = {1,2,3,4,5,6,7};
vec.erase(vec.begin() + n); //removes n-th element
否则,您将重新创建已在标准库中创建和提供的功能。
当然你的用例可能非常具体,你真的需要使用普通的旧数组,但是嘿 - 用断点等做一些调试。
答案 1 :(得分:0)
看起来好像你应该减少计数作为删除操作的一部分。
delete[] sections;
count--; // Decrease size
sections = tempArray;
}
如果不这样做,那么您将阅读超出数组限制的内容,事情将会失败(崩溃)。