malloc分配的对象的动态类型是什么? C++标准是指“动态类型”(C标准指的是“类似类型”中的“有效类型”),例如
如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:malloc分配的对象的动态类型是什么? C++标准是指“动态类型”(C标准指的是“类似类型”中的“有效类型”),例如,c++,malloc,language-lawyer,C++,Malloc,Language Lawyer,如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义: 对象的动态类型 但是如何确定分配给malloc的对象的动态类型 例如: void *p = malloc(sizeof(int)); int *pi = (int*)p; pi指向的对象的动态类型是否为int?动态类型是一个正式术语,用于描述基本上多态的对象,即至少具有一个虚拟功能的对象。因此,C是一个C++术语,它没有“代码>虚拟< /代码>的概念,例如: 但是如何使用malloc分配对象的动态类型呢 决心
- 对象的动态类型
malloc
的对象的动态类型
例如:
void *p = malloc(sizeof(int));
int *pi = (int*)p;
pi
指向的对象的动态类型是否为int
?动态类型是一个正式术语,用于描述基本上多态的对象,即至少具有一个虚拟
功能的对象。因此,C是一个C++术语,它没有“代码>虚拟< /代码>的概念,例如:
但是如何使用malloc分配对象的动态类型呢
决心
事实并非如此malloc
分配N
原始字节的内存,并通过void*
返回它-您的工作是推断正确的类型。此外,该内存仅表示对象所在的区域,但在显式调用其构造函数之前,该对象将不会处于活动状态。(再次,从C++的角度)
pi指向的对象的动态类型是否为int
否,因为术语“动态类型”在用类类型描述对象时是有意义的int
不是,也不能是
class Foo
{
//virtual ~Foo() = default;
virtual void f() {}
};
class Bar : public Foo
{
virtual void f() {}
};
// ...
Foo *ptr = new Bar();
这里的
Foo
是ptr
的静态类型,而Bar
是它的动态类型。在C中,有效类型仅在访问对象时才相关。那么in是由
- 声明类型(如果有)
- 作为副本的另一个对象的类型(例如
)memcpy
- 通过其访问的左值的类型,例如,如果一个
被转换为另一个指针类型(例如void*
),然后该指针类型被取消引用int*
如果将
malloc
的返回值指定给指针类型,则后者通常与malloc
对象有关。根据C++11标准中的1.3.7
动态类型
glvalue表达式表示的glvalue引用的最派生对象(1.8)的glvalue类型
[示例:如果静态类型为“指向类B的指针”的指针(8.3.1)p指向类的对象
D、 根据B(第10条),表达式*p的动态类型为“D”。参考文件(8.3.2)被处理
类似地。-结束示例]
例如
class A {}
class B : public A {}
A *a = new B;
a
的“静态”类型是a*
,而其动态类型是B*
引用不同类型的概念是为了防止
class A{}
class B : public A {int x;}
class C : public A {int y;}
A *a = new B;
reinterpret_cast<C *>(a)->x;
class A{}
B类:公共A{int x;}
C类:公共A{int y;}
A*A=新的B;
重新解释(a)->x;
这可能导致未定义的行为
<> >代码> Vult*/COD>不指向一个对象,但动态和声明类型之间的区别只对对象有意义。< P>根据C++规范: 动态类型: glvalue表达式表示的glvalue引用的最派生对象(1.8)的类型
malloc
的返回值是一个未初始化的存储块。在该存储中未构造任何对象。因此它没有动态类型
void*
不指向对象,只有对象具有动态类型
可以通过开始对象的生命周期在该存储中创建对象。但在你这么做之前,它只是存储。现状是
malloc
不创建对象。只有new
表达式、定义、强制类型转换和对变量成员的赋值。请参阅,以了解关于此的正确措辞
如果要使用由malloc
生成的存储,假设它已正确对齐(除非使用扩展对齐),请调用placement new:
auto p = malloc(sizeof(int));
int* i = new (p) int{0};
// i points to an object of type int, initialized to zero
因此,在C++中使用MALOC是相当无用的,BOG标准<代码>新< /COD>有效地将上述步骤合并为一个。
另见询问者的相关问题。我认为你的假设是错误的,在C中,这个术语似乎不存在。也许你的意思是“有效型”?我认为对于C++的这些规则可能有很大的不同,所以也许你最好问两个独立的问题。在C++中,动态类型是一个由基类型指针指向的实际派生类型。与C无关。@JensGustedt你是对的,它在C中被称为“有效类型”。@vitaut:术语“有效类型”和“动态类型”根本没有任何关系。@M.M:但还没有“类型T的对象”。您从哪里获得
float
和int
?它们不是malloc
调用的一部分。没有对象的存储。所有对象都需要存储,但并非所有存储都需要对象。我认为这是不对的,因为在标准的“动态类型”中似乎包括基本类型。@vitaut:只有在最技术的意义上,它才包括非虚拟类型。非虚拟类型的动态类型为自身。glvalue表达式表示的glvalue引用的最派生对象(1.8)的动态类型[示例:如果静态类型为“指向类B的指针”的指针(8.3.1)p指向从B派生的类D对象(第10条),则表达式*p的动态类型为“D”参考文献(8.3.2)也被类似地对待。-结束示例]@vitaut:我理解这些术语可能看起来是相关的,但它们完全不是;如果你有更明确的建议,请告诉我。C++标准不使用“有效类型”一词。谢谢标准的引用,但是MALOC结果如何?pi指向的对象是否具有动态类型int?谢谢。那我的朋友呢