具有动态分配的结构数组元素的动态分配的结构数组

时间:2019-02-26 08:57:58

标签: c++ structure dynamic-memory-allocation

请考虑以下代码:

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分配内存。

在这种情况下,我遇到了细分错误。有什么好的方法可以动态分配内存?如果我需要重新分配内存(以动态增加数组大小)怎么办?

4 个答案:

答案 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