malloc分配的内存何时获得类型?

12

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

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

这带来另一个问题:在何时说malloc返回的存储空间获得了类型?例如:

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

尽管未被初始化,我们可以说pi指向一个动态类型为int的对象吗?


@SteveJessop关于对象生命周期的内容并没有在C++14中提到。 - M.M
@M.M:哦,他们改了吗? - Steve Jessop
2
@SteveJessop 如果我没记错的话,有一个针对C语言的对象,但没有针对C++。 - T.C.
答案仍然是“永远不会”。变量在编译时具有类型,构造函数可以在访问适当(符合标准)的方式时对一块内存进行操作,以便为其配备RTTI信息,但即使如此,也不能等同于说该内存获取了类型。关于p1,你可以说它是指向动态内存中的int指针,但你不能说任何关于“动态类型为int的对象”的事情,因为这样的东西不存在。 - user207421
@M.M. 嗯,不是“精确地”那样,但正如T.C.在下面解释的那样,当您使用新表达式编写一个int时,就会出现这种情况。 - Steve Jessop
显示剩余3条评论
2个回答

11
根据标准,现状是那里没有对象。

[intro.object]/1:

一个对象可以通过定义 ([basic.def])、通过一个 new 表达式 ([expr.new]) 或在需要时由实现 ([class.temporary]) 来创建。
另请参见P0137中的讨论,该引用将上述引语作为对象的定义:
“起草说明:这保持了现状,即仅使用 malloc 不足以创建对象。” (int *)p 不属于这些情况。

3
*p = 0 不能创建对象,但 new (p) int() 可以创建一个对象。 - T.C.
2
@SteveJessop 如果 p 没有被赋值指向一个对象,访问该 glvalue 会导致未定义行为。如果是这样的话,争论其副作用没有什么意义。 - Columbo
2
@SteveJessop,这只是未定义的行为,因为p没有指向任何对象。 - Columbo
3
那在技术上一直都是未定义行为,甚至可以追溯到 C++03。 - T.C.
2
如果这些评论是可信的,那么完全有效的C程序在C++中突然变成了UB,因为C++标准忘记定义如何在未初始化的内存中创建POD。我很难相信这样一个基本的概念被忽视了18年... - MSalters
显示剩余8条评论

3
答案是:当malloc()分配的存储空间中创建一个对象时。
注意:malloc()在C标准中定义,并在C++标准中引用。与C++标准的交互是为了兼容性而非主要来源。
malloc()返回一个指向唯一存储区域(或NULL)的指针。它不会分配或返回对象。可以通过各种方式在该存储空间中创建对象,而类型属于对象,而不是存储空间。
问题中给出的示例代码创建了一个有类型的指针,但对存储空间没有影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接