C++ - 将元素按升序插入数组的 SEG 错误



作为管理Book对象数组的BookGroup类的一部分,我被要求创建一个void add(Book* b)成员函数,该函数将给定的Bookb添加到正确位置的书籍数组中(从最早的出版年份到最近的出版年份(。我需要将数组中的元素移到数组的后面,以便为新元素的正确位置腾出空间。我不允许简单地添加到数组的末尾,然后在数组上进行排序或使用任何排序函数/排序算法。

我尝试测试我的添加功能,但遇到了一个 seg 错误。我的方法是在数组的末尾添加任何新书,如果该特定书籍的出版年份比数组中的最后一本书早(数量更少(,我会让两本书交换位置。如果没有,这本书将停留在数组末尾的同一位置。然后我继续这个过程。

我不知道是什么导致了赛格故障。作为旁注,我想知道我是否应该在add()的任何时候使用删除功能?我对我的编译器进行了 valgrind 检查,它说我的程序中某处丢失了一堆字节。我的猜测是,很大一部分字节可能来自 add 函数,但我不确定,只是想仔细检查一下。

bookCollection应该是静态分配的Book对象指针数组。有两个类 - Book.cc 类和 BookGroup.cc 类。

我决定展示我的所有代码,以便人们可以编译它,但请只发布必要的内容,不要在下面的答案中发布所有代码。

BookGroup.cc:

#include <iostream>
#include <iomanip>
using namespace std;
#include "BookGroup.h"
BookGroup::BookGroup(int n){ 
numOfBooks = n; 
}
void BookGroup::add(Book* b){ 
if(numOfBooks != MAX_BOOKS){
if(numOfBooks == 0){
bookCollection[0] = b; //add first element
++numOfBooks; //increase numOfBooks by 1 and go to next statement
}else{
for(int i = numOfBooks-1; i >= 0; --i){ //start at end of array and work towards front where lowest years are
if(b->getPubYear() < bookCollection[i]->getPubYear()){
bookCollection[i + 1] = bookCollection[i]; //swap positions if b is lower than last element
bookCollection[i] = b;
}else{
b = bookCollection[i + 1]; //otherwise stay in the same spot (keep b at the end)
//break;
}
}
++numOfBooks;
}
}
cout<<"Book could not be added to collection. No more space "<<endl; 
}

书组:

#ifndef BOOKGROUP_H
#define BOOKGROUP_H
#define MAX_BOOKS 15
#include <string>
using namespace std;
class BookGroup
{
public:
BookGroup(int);
BookGroup(BookGroup&);  
~BookGroup();
void print();
void add(Book*);
Book* bookCollection[MAX_BOOKS];
private: 
int numOfBooks;
};
#endif

Book.cc:https://pastebin.com/9swrwYgx

书:https://pastebin.com/mqDn2C30

生成文件:https://pastebin.com/xHKDsVL1

主:https://pastebin.com/TBzyduMC

当我尝试运行它时:

宣布两个书组...

正在初始化两个书籍组...

-- 默认 书籍记录员:彼得潘 年份:1982

分段错误

BookGroup::BookGroup(int n){ 
numOfBooks = n; 
}

连同这个

BookGroup suzy(2);

创建不包含任何指向有效书籍的指针的书籍组,但假装包含 2。

然后这里

for(int i = numOfBooks-1; i >= 0; --i)
{ //start at end of array and work towards front where lowest years are
if(b->getPubYear() < bookCollection[i]->getPubYear()){

您开始访问索引 1(因为 numBooks==2(,这不是一个有效的指针。

你应该

  • 正确初始化数组,例如使用 NULL,以确保以后检查干净地工作
  • 仔细检查
  • 是否只在任何地方使用有效的指针,如有必要,请仔细检查两次
  • 不使用非零数量的假装书籍初始化空组

最新更新