在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 语言 】位操作符详解
228 0
|
6月前
|
Java C++ Python
Python 教程之运算符(3)—— G-Fact 19(布尔逻辑和位非运算符)
Python 教程之运算符(3)—— G-Fact 19(布尔逻辑和位非运算符)
43 0
|
6月前
|
Python
【python】—— 内置类型、运算符、表达式、关键字
【python】—— 内置类型、运算符、表达式、关键字
|
6月前
|
开发者 索引 Python
Python中的海象运算符:简洁而强大的赋值表达式
【4月更文挑战第17天】Python 3.8 引入了海象运算符 `:=`,也称赋值表达式运算符,用于在表达式内部赋值,简化代码并提升可读性。它能用于条件判断、循环控制和函数参数等场景,优化逻辑流程。然而,使用时需注意可读性、运算符优先级及赋值限制,以确保代码清晰易懂。海象运算符是Python编程的一个有用工具,但应根据情况谨慎使用。
N..
|
6月前
|
Dart
Dart语言中的条件表达式和运算符
Dart语言中的条件表达式和运算符
N..
77 0
|
6月前
|
Go 索引
Go 语言基本类型和运算符用法
Go 语言基本类型和运算符用法
30 0
|
6月前
|
C语言
C 语言运算符详解
运算符用于对变量和值进行操作。 在下面的示例中,我们使用 + 运算符将两个值相加:
177 0
|
编译器 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
122 0
Python运算符(二):赋值/比较/逻辑
Python运算符(二):赋值/比较/逻辑
C语言之运算符用法(补充前面运算符中的不足)
C语言之运算符用法(补充前面运算符中的不足)
下一篇
无影云桌面