【问题标题】:Can we reuse allocated memory我们可以重用分配的内存吗
【发布时间】:2018-02-01 11:23:19
【问题描述】:

这是对this question的跟进。

在解释我的问题时,我声明分配的内存可以重复使用,因为它没有声明类型,并且我被告知这是不正确的 C。

这是一个说明问题的代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

struct Elt {
    int id;
    char name[32];
};

struct Elt2 {
    double val;
    char name[16];
};

static_assert(sizeof(struct Elt2) < sizeof(struct Elt), "Incorrect sizes");

int main() {
    struct Elt actual1 = { 1, "foo"};
    struct Elt2 actual2 = {2.0, "bar"};

    struct Elt* elt = malloc(sizeof(struct Elt));
    memcpy(elt, &actual1, sizeof(*elt));          // populates the allocated memory
    printf("elt: %d %s\n", elt->id, elt->name);
    struct Elt2 *elt2 = (void *) elt;             // declares a new pointer to a shorter type
    memcpy(elt2, &actual2, sizeof(*elt2));        // effective type is now struct Elt2
    printf("elt2: %g %s\n", elt2->val, elt2->name);
    //printf("elt: %d %s\n", elt->id, elt->name);    UB: storage now contains an Elt2 object
    free(elt);                                    // only legal use for elt
    return 0;
}

我相信草案 n1570 的 6.5 表达式 §6 允许:

访问其存储值的对象的有效类型是声明的类型 对象,如果有的话。87) 如果一个值通过 左值的类型不是字符类型,则左值的类型变为 该访问和不修改的后续访问的对象的有效类型 存储的值。如果一个值被复制到一个没有声明类型的对象中,使用 memcpy 或 memmove,或复制为字符类型的数组,则为有效类型 该访问的修改对象以及不修改该访问的后续访问 value 是从中复制值的对象的有效类型(如果有的话)。

附注 87:

87) 分配的对象没有声明类型。

问题:

是否重用分配的内存来存储不同的对象可以适合该内存符合C?

【问题讨论】:

  • “分配的内存可以被重用,因为它没有声明类型,我被告知它是不正确的 C。” 我没有找到任何人会说或暗示。
  • 另外,问题是“我可以基于 malloc 编写 my_malloc”,正如 C 传统中一直期望的那样。此外,C 传统对 C 标准委员会有什么意义。 (对于 C++ 也是如此。)

标签: c memory-management malloc language-lawyer


【解决方案1】:

如果没有,那将是灾难性的。许多人使用这些技巧在malloc 上实现自己的细粒度内存管理。

所以,是的,这正是您引用的标准中的段落的内容。请注意,它仔细选择了单词。它说

如果一个值被存储到一个没有声明类型的对象中......

这个没有声明类型的属性在对象的整个生命周期内都不会改变,因此该规定适用于任何时候向其中写入新值。

如果委员会出于某种奇怪的原因想说有效类型只能更改一次,他们会说类似

如果一个值被存储到一个没有有效类型的对象中......

【讨论】:

  • 感谢您确认我的想法。但是我的referenced question 中的编辑确实有意义:memcpy 从字符类型数组到分配的结构是否将有效类型更改为字符数组?
【解决方案2】:

唯一正确的答案是完全源自标准的答案。

如果不通过标准,我会说,“是的,你的假设是正确的”。我这么说是因为没有它,就不可能实现自己的内存管理器。我认为如果没有它,即使malloc 也无法在 C 中实现。

【讨论】:

  • C 和 C++ 标准写得很糟糕,在基本问题上模棱两可。
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 2019-09-06
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2019-04-08
  • 2021-06-06
相关资源
最近更新 更多