在C++编程语言中new和delete运算符

简介: 在C++编程语言中new和delete运算符


在 C++ 编程语言中,new 和 delete 运算符用于动态内存分配和释放。这些运算符与内存堆(heap)的交互,允许程序员在运行时分配和撤销内存块。

new 运算符

new 运算符用于在内存堆上分配一块内存,并返回一个指向该内存块的指针。当使用 new 分配内存时,系统还会调用构造函数来初始化分配的对象。

image.png

在上面的例子中,new int(10) 分配了一块内存,并使用构造函数 int(10) 初始化了一个 int 类型的对象。ptr 指针指向这块内存。

delete 运算符

delete 运算符用于释放由 new 分配的内存。当使用 delete 释放内存时,系统会调用析构函数来清理对象,如果对象是一个类实例,则还会调用虚析构函数(如果存在的话)。

image.png

在上面的例子中,delete ptr; 释放了之前由 new 分配的内存。注意,释放内存后,指针 ptr 变为 nullptr,即空指针。

注意事项

不要在 delete 之后使用指针:一旦释放了内存,指针就不再有效,尝试访问它会导致未定义行为。

不要在 delete 之后立即用 new 重新分配同一块内存:这样做会导致内存泄漏,因为旧内存没有被正确释放。

如果你连续释放同一个指针多次,只会释放一次内存。

异常安全

new 和 delete 运算符不是异常安全的。如果你在构造函数或析构函数中抛出异常,内存可能会泄漏。为了保证异常安全,可以使用 new(std::nothrow),它会在内存分配失败时返回 nullptr,或者使用智能指针如 std::unique_ptr 或 std::shared_ptr。

image.png

智能指针

在 C++11 及更高版本中,推荐使用智能指针来管理动态分配的内存,因为它们提供了自动内存管理的功能,可以确保对象在不再需要时被正确释放。

image.png

相关文章
|
6月前
|
存储 算法 程序员
【c 语言 】位操作符详解
【c 语言 】位操作符详解
212 0
|
6月前
|
Java C++ Python
Python 教程之运算符(3)—— G-Fact 19(布尔逻辑和位非运算符)
Python 教程之运算符(3)—— G-Fact 19(布尔逻辑和位非运算符)
41 0
|
6月前
|
存储 算法 编译器
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
151 0
|
6月前
|
开发者 索引 Python
Python中的海象运算符:简洁而强大的赋值表达式
【4月更文挑战第17天】Python 3.8 引入了海象运算符 `:=`,也称赋值表达式运算符,用于在表达式内部赋值,简化代码并提升可读性。它能用于条件判断、循环控制和函数参数等场景,优化逻辑流程。然而,使用时需注意可读性、运算符优先级及赋值限制,以确保代码清晰易懂。海象运算符是Python编程的一个有用工具,但应根据情况谨慎使用。
|
6月前
|
Go 索引
Go 语言基本类型和运算符用法
Go 语言基本类型和运算符用法
30 0
|
6月前
|
缓存 Python
Python 中的==操作符 和 is关键字
Python是一种功能强大的通用编程语言,提供了各种比较值和对象的方法。其中包括==操作符和is关键字,它们的用途不同,但由于它们有时可以达到相同的目的,所以经常会被混淆。在本文中,我们将深入研究==和is之间的区别,探索它们如何工作以及何时适当地使用它们。
89 2
|
6月前
|
C语言
C 语言运算符详解
运算符用于对变量和值进行操作。 在下面的示例中,我们使用 + 运算符将两个值相加:
171 0
|
Python
Python 常用运算符(算术、比较、赋值、逻辑、成员)
Python 常用运算符(算术、比较、赋值、逻辑、成员)
86 1
|
编译器 C++
C++new和delete运算符介绍
内存管理运算符 new、new[]、delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数。一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内存时才会重载。 以成员函数的形式重载 new 运算符: void * className::operator new( size_t size ){ //TODO: } 以全局函数的形式重载 new 运算符: void * operator new( size_t size ){ //TODO: } 两种重载形式的返回值相同,都是void *类型,并且都有一个参数,为si
121 0
Python运算符(二):赋值/比较/逻辑
Python运算符(二):赋值/比较/逻辑