在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

相关文章
|
8月前
|
存储 算法 程序员
【c 语言 】位操作符详解
【c 语言 】位操作符详解
267 0
|
8月前
|
Java C++ Python
Python 教程之运算符(3)—— G-Fact 19(布尔逻辑和位非运算符)
Python 教程之运算符(3)—— G-Fact 19(布尔逻辑和位非运算符)
48 0
|
8月前
|
程序员 C语言 C++
C语言操作符if语句好习惯 详解分析操作符(详解4)
C语言操作符if语句好习惯 详解分析操作符(详解4)
|
Python
python之算术运算符,复合运算符,逻辑运算符,比较运算符的定义及其使用方法
python之算术运算符,复合运算符,逻辑运算符,比较运算符的定义及其使用方法
|
7月前
|
Rust 编译器
Rust的Match语句:强大的控制流运算符
Rust的Match语句:强大的控制流运算符
|
8月前
|
开发者 索引 Python
Python中的海象运算符:简洁而强大的赋值表达式
【4月更文挑战第17天】Python 3.8 引入了海象运算符 `:=`,也称赋值表达式运算符,用于在表达式内部赋值,简化代码并提升可读性。它能用于条件判断、循环控制和函数参数等场景,优化逻辑流程。然而,使用时需注意可读性、运算符优先级及赋值限制,以确保代码清晰易懂。海象运算符是Python编程的一个有用工具,但应根据情况谨慎使用。
|
8月前
|
Python
【python】——控制语句和组合数据类型(其二)
【python】——控制语句和组合数据类型(其二)
|
8月前
|
Python
【python】—— 控制语句和组合数据类型(其一)
【python】—— 控制语句和组合数据类型(其一)
|
8月前
|
Go 索引
Go 语言基本类型和运算符用法
Go 语言基本类型和运算符用法
35 0
|
8月前
|
C语言
C语言if语句的关系表达式
C语言if语句的关系表达式
85 0