gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:05:41 24 4
gpt4 key购买 nike

我有一个名为 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/

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