如何为结构内的嵌套结构和联合分配内存?
Posted
技术标签:
【中文标题】如何为结构内的嵌套结构和联合分配内存?【英文标题】:How is memory allocated for nested struct and union inside a struct? 【发布时间】:2019-12-18 12:17:39 【问题描述】: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 ?
在网上看到这个sn-p代码,谁能解释一下如何为上述结构创建内存,因为当一个值被分配给数组联合时,它被分配给内部结构变量。
我认为最初最里面的 Struct 会为每个成员分别创建内存,如何为 union.union 创建一个具有 10*double 大小的单个块,但如何在内部联合和结构之间创建映射。
【问题讨论】:
"联合体的大小仅与容纳其最大数据成员所需的一样大。其他数据成员分配在与该最大成员的一部分相同的字节中。该分配的详细信息是实现定义... " 来源:en.cppreference.com/w/cpp/language/union “内存已创建”是什么意思?你的意思是“这个结构在内存中是如何布局的?”请尝试使用标准术语。 错误的直觉:没有创建内存,只是分配了内存。你需要阅读一本好的 C++ 编程书籍,比如this one。后来读了一些 C++ 标准,比如n3337。我们不能用几段话教你 C++。 en.cppreference.com/w/cpp/language/union ***.com/a/2902171/17034 【参考方案1】:在声明联合时。所有 union 的变量在内存中重合(占用相同的空间)。
在您的示例中,数组和结构存在于相同的确切内存空间中。所以设置 array[0] 将覆盖 a1。 array[1] 将覆盖 a2 等等...
【讨论】:
【参考方案2】:虽然结构将其成员彼此相邻放置,但联合本质上是将其成员叠加在彼此之上。在结构的成员中,所有成员都可以同时处于活动状态。在一个工会的成员中,在任何时间点最多有一个人可以活着。结构的值可以是其成员值的任意组合。另一方面,工会的价值只能是其成员之一的价值。如果您一次只需要保留一组不同类型的值中的一个,union
很有用。
在您的特定示例中,struct A
内部的联合基本上覆盖了成员 array
,这是一个由十个 int
组成的数组,具有一个具有十个类型为 int
的成员的匿名结构(注意,匿名结构是非标准的,但大多数编译器都支持)。这样做可能是为了能够通过名称或通过数组通过它们的“索引”访问结构的成员。十个int
的数组和具有十个int
类型成员的结构的内存布局通常会使得结构的连续成员最终在内存中与数组的连续元素重合。因此,这通常会在大多数情况下在实践中“起作用”。
虽然这在大多数情况下通常会在实践中“工作”,但它不是正确的 C++(因此是“”)。通过分配给数组的一个元素,您开始了该联合成员 [class.union]/5 的生命周期。开始该联合成员的生命周期会结束在[basic.life]/1 之前可能还活着的任何其他联合成员的生命周期。这意味着当您将某些内容分配给数组的元素时,该结构不再存在。当您将某些内容分配给结构的成员时,该数组不再存在。在数组处于活动状态时尝试访问结构的成员,或在结构处于活动状态时尝试访问数组的元素会导致不安全的行为(因为您正在尝试访问不存在于一种不受任何明确允许您这样做的例外的方式[class.mem]/23)。不要这样做,这是错误的。
A
的内存是像任何其他结构一样“创建”的。您创建特定类型的对象。这样做会自动为对象分配存储空间,或者要求您在开始创建对象之前手动分配存储空间。结构A
的非静态数据成员是结构的子对象。它们是结构对象的一部分。当完整的A
对象被销毁并释放为其分配的内存时,非静态数据成员也被销毁并释放内存,因为它是为完整对象分配的内存的一部分……
【讨论】:
以上是关于如何为结构内的嵌套结构和联合分配内存?的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
C 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )