内存分配运算符和表达式 在C++中,“新”是一个运算符,还是一个表达式或某种关键字?我想到的一个类似问题是,我应该称“=”为运算符还是表达式?

内存分配运算符和表达式 在C++中,“新”是一个运算符,还是一个表达式或某种关键字?我想到的一个类似问题是,我应该称“=”为运算符还是表达式?,c++,C++,新的is运算符。您可以重载它并编写自己的版本。我还认为这是个算符。表达式是由操作符、变量、函数调用等组成的更复杂的事物,请尝试获得C++语言标准。它必须描述你提到的所有事情 C++将内存分配和对象生存期的概念分开。与C相比,这是一个新特性,因为在C中,对象相当于它的内存表示(在C++中称为“POD”) 当构造函数完成时,对象开始其生命周期,当析构函数完成时,对象生命周期结束。因此,对于具有动态存储持续时间的对象,生命周期由四个关键里程碑组成: 内存分配 对象构造 对象销毁 内存释放 < > C+

新的is运算符。您可以重载它并编写自己的版本。我还认为这是个算符。表达式是由操作符、变量、函数调用等组成的更复杂的事物,请尝试获得C++语言标准。它必须描述你提到的所有事情

C++将内存分配和对象生存期的概念分开。与C相比,这是一个新特性,因为在C中,对象相当于它的内存表示(在C++中称为“POD”)

当构造函数完成时,对象开始其生命周期,当析构函数完成时,对象生命周期结束。因此,对于具有动态存储持续时间的对象,生命周期由四个关键里程碑组成:

  • 内存分配
  • 对象构造
  • 对象销毁
  • 内存释放
  • < > C++中动态分配内存的标准方式是全局代码<::运算符NeXOR()/COD>,以及使用<代码>::但是,要构建对象,只有一种方法:新表达式:

    这种最常见的新表达式形式一步完成分配和构造。它相当于分解版本:

    void * addr = ::operator new(sizeof(T));
    T * p = new (addr) T;  // placement-new
    
    同样,delete表达式
    delete p首先调用析构函数,然后释放内存。这相当于:

    p->~T();
    ::operator delete(addr);
    
    因此,默认的new和delete表达式在一次清洗中执行内存分配和对象构造。新表达式的所有其他形式,统称为“placement new”,在构造对象之前调用相应的placement new操作符来分配内存。但是,没有匹配的“placement delete expression”,所有使用placement new创建的动态对象都必须使用
    p->~T()手动销毁

    总之,区分新表达式和新运算符非常重要。这是C++中内存管理的核心。

    < P>这是所有的。

    2.13表4明确列出了
    new
    作为关键字

    5.3.4引入了
    新表达式
    。这是一个表达式,例如
    newint(5)
    ,它使用
    new
    关键字、类型和初始值

    5.3.4/8然后声明调用
    运算符new
    ,为新表达式创建的对象分配内存


    =
    的工作原理完全相同。每个类都有一个
    运算符=
    (除非明确删除),该运算符用于赋值表达式中。我们通常称
    a=5只是一个赋值,即使从技术上讲它是“一个包含赋值表达式的表达式语句”。

    投票结束:这不是一个真正的编程问题。@Oli,怎么会这样?这是一个关于编程语言语义的特定的、可回答的问题。这个问题的一个小问题是,它假设关键字不能是表达式
    这是一个明确的反例。也许你可以引用标准中的一些内容来支持你的答案。我也听到了术语赋值表达式,你能提供一些例子吗?谢谢。事实上这不正确<代码>新建
    是最常见的新表达式。
    p->~T();
    ::operator delete(addr);