gpt4 book ai didi

c++ - C++-将元素按升序插入数组时出现段错误

转载 作者:行者123 更新时间:2023-12-02 10:36:30 27 4
gpt4 key购买 nike

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

我尝试测试我的add函数,但遇到段错误。我的方法是在阵列的末尾添加任何新书,如果特定书的出版年份比阵列中的最后一本书还早(数量少于),则我将两本书互换位置。如果不是这样,那本书将排在阵列的尽头。然后,我继续此过程。

我不知道是什么原因导致段错误。作为附带说明,我想知道是否应该在add()中的任何时候使用delete函数?我对编译器进行了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;
}

BookGroup.h:
#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

Book.h: https://pastebin.com/mqDn2C30

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

主要: https://pastebin.com/TBzyduMC

当我尝试运行它时:

宣告两个书籍群组...

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

-默认书籍作者:彼得·潘(Peter Pan)年: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,以确保以后可以干净地进行检查
  • 再次检查您是否仅在各处使用有效的指针,如有必要,请两次
  • 不会使用非零数量的假书
  • 初始化一个空组

    关于c++ - C++-将元素按升序插入数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60051216/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com