gpt4 book ai didi

c++ - 内存分配运算符和表达式

转载 作者:太空狗 更新时间:2023-10-29 19:49:40 25 4
gpt4 key购买 nike

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

最佳答案

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

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

  1. 内存分配。
  2. 对象构建。
  3. 对象销毁。
  4. 内存释放。

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

T * p = new T;

new 表达式的这种最常见的形式在一个步骤中进行分配和构建。它相当于分解版本:

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

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

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

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

总而言之,区分new 表达式operator new 是非常重要的。这确实是 C++ 内存管理的核心。

关于c++ - 内存分配运算符和表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com