malloc分配的内存在什么时候获得类型?

vit*_*aut 10 c++ malloc memory-management language-lawyer

这个问题询问malloc根据最佳答案分配的对象的动态类型是什么:

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

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

void *p = malloc(sizeof(int));
int *pi = (int*)p;
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 9

根据标准的现状是那里没有对象.

[intro.object]/1:

在需要时,通过定义([basic.def]), new-expression([expr.new])或实现([class.temporary])创建对象.

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

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

(int *)p 不是这些.

  • @SteveJessop`*p = 0`不会创建一个对象,但`new(p)int()`会创建一个对象. (3认同)
  • @SteveJessop这一直是技术上的UB,一直回到C++ 03. (3认同)
  • @SteveJessop如果尚未将`p`指定为指向对象,则访问该glvalue会导致未定义的行为.如果是这样的话,争论它的副作用是没有意义的. (2认同)
  • @SteveJessop它只是有未定义的行为,因为`p`没有指向一个对象. (2认同)
  • 如果相信这些评论,完全有效的C程序突然在C++中成为UB,因为C++标准忘记定义如何在未初始化的内存中创建POD.我发现很难相信这样一个基本概念已经被忽视了18年...... (2认同)