Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc分配的对象的动态类型是什么? C++标准是指“动态类型”(C标准指的是“类似类型”中的“有效类型”),例如_C++_Malloc_Language Lawyer - Fatal编程技术网

malloc分配的对象的动态类型是什么? C++标准是指“动态类型”(C标准指的是“类似类型”中的“有效类型”),例如

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分配对象的动态类型呢 决心

如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:

  • 对象的动态类型
但是如何确定分配给
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?谢谢。那我的朋友呢