我有一个名为 Item 的类,它存储一个在编译时已知大小的数组:
class Item
{
int *data;
public:
Item(int array[], int length)
{
std::copy(array, array + length, data); // Line A
}
};
在我的示例中,大小等于 1,但对于我的项目,我也需要更大的值。这是一个存储两个 Item 的 Box 类。我不想在构造函数中有两个参数,所以我传递了一个大小为 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/