收缩阵列。复制时数据丢失

时间:2015-03-20 11:18:48

标签: c++

我有这样你可以从数组中删除一个值,当你这样做时,所有其他值都应该移动,所以数组中没有间隙。在函数运行之后,我想对新数组执行某些操作程序崩溃并且无法找到值。

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;
};

2 个答案:

答案 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;
}

如果不这样做,那么您将阅读超出数组限制的内容,事情将会失败(崩溃)。