繁体   English   中英

内存分配运算符和表达式

[英]Memory allocation operators and expressions

在C ++中,'new'是一个运算符还是一个表达式或某种关键字? 我想到一个类似的问题是,我应该将'='称为运算符或表达式吗?

C ++分离了内存分配和对象生存期的概念。 这是与C相比的新特性,因为在C中,对象等同于其内存表示(在C ++中称为“POD”)。

一个对象在构造函数完成时开始它的生命,它的生命在析构函数完成时结束。 对于动态存储持续时间的对象,生命周期因此包括四个关键里程碑:

  1. 内存分配。
  2. 对象构造。
  3. 对象破坏。
  4. 内存释放。

C ++中动态分配内存的标准方法是使用global ::operator new() ,并使用::operator delete()释放。 但是,要构造一个对象,只有一个方法:一个新的表达式

T * p = new T;

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

void * addr = ::operator new(sizeof(T));
T * p = new (addr) T;  // placement-new

同样, 删除表达式 delete p; 首先调用析构函数然后释放内存。 它相当于:

p->~T();
::operator delete(addr);

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

总之,将新表达式operator new区分开来非常重要。 这实际上是C ++中内存管理的核心。

这就是所有这些。

2.13表4明确地将new列为关键字。

5.3.4介绍new-expression 这是一个表达式,例如new int(5) ,它使用new关键字,类型和初始值。

5.3.4 / 8然后声明调用operator new来为new-expression创建的对象分配内存

=工作完全一样。 每个类都有一个operator= (除非明确删除),它在赋值表达式中使用。 我们通常称a=5; 只是一个赋值,即使它在技术上是“包含赋值表达式的表达式语句”。

新的是运营商。 你可以重载它并编写自己的版本。 另外我认为=是运营商。 表达式是更复杂的东西,包括运算符,变量,函数调用等。请尝试获得C ++语言标准。 它必须描述你提到的所有事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM