如何为结构中的嵌套结构和联合分配内存?

时间:2019-12-18 12:17:39

标签: c++ visual-c++

struct A
{
     union 
    {
       int array[10];

    struct 
        {
        int a1;
        int a2;
        ...
        ...
        int a10;
        };

};

A a; //1 - structure defination
a.array[0] = 10 //2 - then a.a1 is also assigned with value 10. so how does memory is created.

A *a = new A;
delete a;// does compiler takes care of deleting union and struct members inside struct ? 

在线查看这段代码,谁能解释上面的结构是如何创建内存的,因为当将值分配给数组的并集然后将其分配给内部结构变量时。

我认为最初最里面的Struct会为每个成员分别创建带有内存的内存,如何为union设置内存.union创建一个10 * double大小的单个块,但是如何在内部union和struct之间创建映射。 / p>

2 个答案:

答案 0 :(得分:1)

声明工会时。所有并集变量都在内存中重合(占用相同的空间)。

在您的示例中,数组和结构存在于相同的确切内存空间中。因此设置array [0]将覆盖a1。 array [1]将覆盖a2,依此类推...

答案 1 :(得分:0)

虽然结构将其成员彼此相邻放置,但联合实际上将其成员彼此重叠。在结构的成员中,所有成员都可以同时存在。在工会的成员中,最多可以在任何时间点活着。结构的值可以是其成员值的任何组合。另一方面,工会的价值只能是其成员之一的价值。如果您一次只需要保留一组不同类型的值中的一个,则union很有用。

在您的特定示例中,struct A内部的并集本质上覆盖了成员array,后者是由十个int组成的数组,并具有一个匿名结构,该结构具有十个类型为{{ 1}}(请注意,匿名结构是非标准的,但大多数编译器都支持)。据推测,这样做是为了能够通过其名称或通过数组的“索引”访问结构的成员。十个int数组和十个int类型成员的结构的内存布局通常将使该结构的连续成员最终在内存中与该数组的连续元素重合。因此,通常在大多数情况下都可以“起作用”。

尽管通常在大多数情况下这在实践中是“可行的”,但它不是正确的C ++(因此为“”)。通过分配给数组的元素,可以开始该联合成员[class.union]/5的生命周期。从该工会成员的生存期开始,到[basic.life]/1之前可能还活着的任何其他工会成员的生存期结束。这意味着,当您向数组的元素分配某些内容时,该结构将不再有效。当您向结构的成员分配某些内容时,该数组将不再有效。尝试在数组处于活动状态时访问该结构的成员,或尝试在结构处于活动状态时访问该数组的元素会导致未定义的行为(因为您正尝试访问其中不存在的对象的值)一种不受任何明确允许您这样做的例外的方式[class.mem]/23)。不要这样做,这完全是错误的。

int的内存是“创建”的,就像其他任何结构一样。您创建特定类型的对象。这样做将自动为对象分配存储空间,或者要求您手动进行存储,才可以首先创建对象。结构A的非静态数据成员是该结构的子对象。它们是struct对象的一部分。当完整的A对象被销毁并释放为其分配的内存时,非静态数据成员也将被销毁并释放内存,因为它是为完整对象分配的内存的一部分……