C ++ - 将元素按升序插入数组时出现段错误
C++ - seg fault from inserting elements into array in ascending order
作为管理 Book
对象数组的 BookGroup
class 的一部分,我被要求创建一个 void add(Book* b)
成员函数来添加给定的 Book
b 到正确位置的一系列书籍(从最早到最近的出版年份)。我需要将数组中的元素移到数组的后面,以便在正确的位置为新元素腾出空间。我不允许简单地添加到数组的末尾,然后对数组进行排序或使用任何排序 function/sorting 算法。
我尝试测试我的添加功能,但出现段错误。我的方法是在数组的末尾添加任何新书,如果该特定书籍的出版年份比数组中的最后一本书早(数量少),我会让这两本书交换位置。否则,这本书将留在阵列最末端的同一位置。然后我继续这个过程。
我不知道是什么导致了段错误。作为旁注,我想知道我是否应该在 add()
中的任何时候使用删除功能?我对我的编译器进行了 valgrind 检查,它说我的程序中某处丢失了一堆字节。我的猜测是很大一部分字节可能来自 add 函数,但我不确定,只是想仔细检查一下。
bookCollection
应该是 Book
对象指针的静态分配数组。有两个 classes - Book.cc 和 BookGroup.cc。
我决定展示我的所有代码,以便人们可以编译它,但请 post 仅 post 只提供必要的代码,并避免 post 在下面的答案中使用所有代码。
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
当我尝试 运行 时:
正在声明两个图书组...
正在初始化两个图书组...
-- 默认图书作者:小飞侠 年份:1982
分段错误
这个
BookGroup::BookGroup(int n){
numOfBooks = n;
}
连同这个
BookGroup suzy(2);
创建不包含任何有效书籍指针但假装包含 2 本书的书籍组。[=13=]
那么这里
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,以确保稍后检查工作干净
- 仔细检查你是否只在任何地方使用有效指针,必要时两次
- 不使用非零数量的假装书籍初始化空组
作为管理 Book
对象数组的 BookGroup
class 的一部分,我被要求创建一个 void add(Book* b)
成员函数来添加给定的 Book
b 到正确位置的一系列书籍(从最早到最近的出版年份)。我需要将数组中的元素移到数组的后面,以便在正确的位置为新元素腾出空间。我不允许简单地添加到数组的末尾,然后对数组进行排序或使用任何排序 function/sorting 算法。
我尝试测试我的添加功能,但出现段错误。我的方法是在数组的末尾添加任何新书,如果该特定书籍的出版年份比数组中的最后一本书早(数量少),我会让这两本书交换位置。否则,这本书将留在阵列最末端的同一位置。然后我继续这个过程。
我不知道是什么导致了段错误。作为旁注,我想知道我是否应该在 add()
中的任何时候使用删除功能?我对我的编译器进行了 valgrind 检查,它说我的程序中某处丢失了一堆字节。我的猜测是很大一部分字节可能来自 add 函数,但我不确定,只是想仔细检查一下。
bookCollection
应该是 Book
对象指针的静态分配数组。有两个 classes - Book.cc 和 BookGroup.cc。
我决定展示我的所有代码,以便人们可以编译它,但请 post 仅 post 只提供必要的代码,并避免 post 在下面的答案中使用所有代码。
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
当我尝试 运行 时:
正在声明两个图书组...
正在初始化两个图书组...
-- 默认图书作者:小飞侠 年份:1982
分段错误
这个
BookGroup::BookGroup(int n){
numOfBooks = n;
}
连同这个
BookGroup suzy(2);
创建不包含任何有效书籍指针但假装包含 2 本书的书籍组。[=13=]
那么这里
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,以确保稍后检查工作干净
- 仔细检查你是否只在任何地方使用有效指针,必要时两次
- 不使用非零数量的假装书籍初始化空组