c++ - 为什么会出现段错误(数组作为类的元素)?

标签 c++ arrays class segmentation-fault runtime-error

我有一个名为 Item 的类,它存储一个在编译时已知大小的数组:

class Item
{
  int *data;
public:
  Item(int array[], int length)
  {
    std::copy(array, array + length, data); // Line A
  }
};

在我的示例中,大小等于 1,但对于我的项目,我也需要更大的值。这是一个存储两个 ItemBox 类。我不想在构造函数中有两个参数,所以我传递了一个大小为 2 的数组(因为该类只能存储 2 个 Item,并且每个都存储一个长度为 1 的数组)。

class Box
{
  Item *item1;
  Item *item2;
public:
  Box(int (&array)[2])
  {
    item1 = new Item(array, 1);
    item2 = new Item(array + 1, 1);
  }
  ~Box()
  {
    delete item1;
    delete item2;
  }
};

这就是我如何创建指向 Box 对象的指针:

int main()
{
  int tab[] = {8, 9};
  Box *box = new Box(tab);
  delete box;
  return 0;
}

运行上面这段代码后,出现了如下错误:

Segmentation fault (core dumped).

我调试了一下,原来是A线导致的问题。我还在我的主函数中创建了 Item 类,它没有给我任何错误。

在我看来,我正在尝试访问我的表之外的一些内存,但这不可能是真的 - 我只想复制我的数组中的一个元素。此外,c++ 编译器无论如何也不会介意。

那么,我做错了什么?我该如何解决?

我正在使用 g++ 编译器和 -std=c++11 选项。

我可以改用 std::array,但出于好奇我想知道我犯了什么错误。

最佳答案

Item 不太正确。当你有:

std::copy(array, array + length, data); // Line A

您实际上从来没有首先为 data 分配任何东西 - 因此您正在写入初始化时该指针中恰好存在的任何垃圾。您需要先执行以下操作:

data = new int[length];
std::copy(array, array + length, data);

虽然你还记得添加一个析构函数,并复制/移动赋值。更好的方法是简单地使用标准提供的内容:

using Item = std::vector<int>;

Besides, the c++ compiler wouldn't mind it anyway.

仅仅因为代码编译 并不意味着它有效。编译为我们捕获了很多错误,但它不能做所有事情!

关于c++ - 为什么会出现段错误(数组作为类的元素)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36086595/

相关文章:

c++ - Boost asio、async_read 和 acync_write 不调用回调

c++ - 模板类 "Sequence/Class Name does not name a type"错误

c++ - 检查数组位置是否为空/空

python - 在数组内查找数组中的特定变量

java - 使用同一类内部的外部方法设置构造函数变量

c++ - 我想使用 set 删除重复元素并在插入时保持顺序

c++ - POCO C++ 库文档有错误吗?

java - CSV 阅读器的危险 - Java

class - 子类的Kotlin变量初始化对于将值初始化为0的行为很奇怪

java - 当仅给定类名作为该类型的字符串时转换为未知类型