请考虑以下代码:
struct X
{
int x1;
int x2;
};
struct Y
{
int y1;
struct X *x;
};
现在,我将动态分配内存,如下所示:
struct Y *y = new Y[N];
对于此结构数组的每个元素,我还如下为y[i].x
分配内存-
y[i].x = new X[M];
在这种情况下,系统将如何在知道y
的实际内存大小之前为y[i].x
分配内存。
在这种情况下,我遇到了细分错误。有什么好的方法可以动态分配内存?如果我需要重新分配内存(以动态增加数组大小)怎么办?
答案 0 :(得分:4)
在这种情况下,系统将如何在知道
y
的实际内存大小之前为y[i].x
分配内存。
哦,但是它确实知道y[i].x
的大小。该成员的类型是struct X*
,它是一个指针。指针的大小因体系结构而异,但通常为64位中的32位。不管X
是什么(几乎没有边缘情况,例如函数指针)。
换句话说,X
不是一段Y
。实际上,Y
的指针指向X
(可能是多个)占用的一块内存。
就像有一个地址。您可以将其写下来并保留下来。每个人都知道纸张的大小。不管有多少(和多大)的房屋占据实际位置。
您的细分错误与所有这些无关。您很可能已经跨越了界限。但是,如果没有实际的代码,很难分辨出来。
答案 1 :(得分:3)
在这种情况下,系统将如何在知道
y
的实际内存大小之前为y[i].x
分配内存。
编译器知道指针的大小,如当前声明的x
。
分段错误最有可能在您尝试取消引用y[i].x
时发生,因为您从未正确分配应指向的内存。
有没有什么好的方法可以动态分配内存?
是的。您应该使用std::vector
来处理所有的障碍和陷阱,为您执行手动内存管理:
struct X
{
int x1;
int x2;
};
struct Y
{
int y1;
std::vector<X> x;
};
std::vector<Y> y(N);
y[i].x.resize(M);
如果我需要重新分配内存(以动态增加数组大小)怎么办?
这也将由std::vector
类进行管理。
答案 2 :(得分:2)
y[i].x
始终是在每个系统上具有固定大小的指针。 (通常是32/64位)。
这就是为什么系统知道要为每个Y实例分配多少内存的原因。
答案 3 :(得分:0)
在这种情况下,系统将如何为y分配内存,然后才知道y [i] .x的实际内存大小。
在 Y 中, x 的类型是指向 X 的指针,所以大小是指针的大小,即指针的大小。分配Y时,指针存储块不相关
有没有什么好的方法可以动态分配内存?如果我需要重新分配内存(以动态增加数组大小)怎么办?
显然,您需要使用std::vector<X>
而不是指向X的指针,您使用的是C ++,而不是C