【问题标题】:At what point does memory allocated by malloc get a type?malloc 分配的内存在什么时候获得类型?
【发布时间】:2016-03-15 23:42:10
【问题描述】:

This questionmalloc分配的对象的动态类型是什么,根据上面的回答:

malloc的返回值是一块未初始化的存储。在该存储中没有构建任何对象。因此它没有动态类型。

这带来了另一个问题:在什么时候说malloc 返回的存储获得了一个类型才有意义。例如:

void *p = malloc(sizeof(int));
int *pi = (int*)p;

我们可以说上面的pi 指向一个动态类型的对象int,尽管事实上它是未初始化的?

【问题讨论】:

  • 我没有提到手,但作为一个持有不回答的人,当你给它写一个int 时。如果其他人想要完成这项工作并获得荣耀,那么引用就在关于对象生命周期(特别是 POD 类型)的某处。
  • @SteveJessop 关于对象生命周期的东西并没有这么说(在 C++14 中)。
  • @M.M:哦,那他们改了吗?
  • 该部分一直在变化
  • @SteveJessop 那里有一个用于 C、IIRC 的对象,但不是 C++。

标签: c++ memory-management malloc language-lawyer


【解决方案1】:

按照标准的现状是没有对象。

[intro.object]/1:

一个对象是由一个定义 ([basic.def]),由一个 new-expression ([expr.new]) 或由实现 ([class.temporary]) 在需要时。

另请参阅P0137 中的讨论,这将使上述引用成为对象的定义:

起草说明:这维持了 malloc 单独的现状 不足以创建对象。

(int *)p 不是这些。

【讨论】:

  • @SteveJessop *p = 0 不会创建对象,但 new (p) int() 会创建一个。
  • @SteveJessop 如果p 没有被指定为指向一个对象,访问该glvalue 会导致未定义的行为。如果是这样,争论它的副作用就没有什么意义了。
  • @SteveJessop 这只是具有未定义的行为,因为p 没有指向对象。
  • @SteveJessop 从技术上讲一直是 UB,一直到 C++03。
  • 如果相信这些 cmets,完全有效的 C 程序突然变成了 C++ 中的 UB,因为 C++ 标准忘记定义如何在未初始化的内存中创建 POD。我很难相信这样一个基本概念已经被忽视了 18 年......
【解决方案2】:

答案是:在 malloc() 分配的存储空间中创建对象时。

注意: malloc() 在 C 标准中定义并在 C++ 标准中引用。与 C++ 标准的交互旨在实现兼容性,而不是作为主要来源。

malloc() 返回的是一个指向唯一存储区域的指针(或 NULL)。它不分配或返回对象。可以通过各种方式在该存储中创建对象,具有类型的是对象,而不是存储。

问题中给出的示例代码创建了一个类型化的指针,但对存储没有影响。

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 2011-02-08
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2022-07-21
    相关资源
    最近更新 更多