C++中new和delete如何正确使用?(内存管理)
技术百科
穿越時空
发布时间:2025-12-29
浏览: 次 new和delete必须严格成对且类型匹配:单个对象用new/delete,数组用new[]/delete[];混用导致未定义行为;推荐用unique_ptr/shared_ptr自动管理,避免内存泄漏与悬空指针。
new和delete必须成对使用,且类型要严格匹配。用new[]分配的数组必须用delete[]释放,否则行为未定义。
new和delete的基本配对规则
每次调用new,都应有且仅有一个对应的delete;每次new[],必须配delete[]。
- 用new int申请单个对象 → 必须用delete ptr
- 用new int[10]申请数组 → 必须用delete[] ptr
- 混用(如new[]配delete)会导致内存泄漏、堆损坏或程序崩溃
避免裸指针管理,优先用智能指针
手动配对容易出错,C++11起推荐用std::unique_ptr和std::shared_ptr自动管理。
-
std::unique_ptr
p(new int(42)); —— 析构时自动delete -
std::unique_ptr
arr(new int[100]); —— 自动调用delete[] - 不再需要显式调用delete,也无需担心忘记释放或重复释放
禁止对同一指针多次delete
delete后指针变成悬空指针,再次delete会引发未定义行为。
- 释放后立即将指针置为nullptr: delete p; p = nullptr;
- 用智能指针可彻底规避该问题(
移动后原指针自动为空) - 注意:delete nullptr是安全的,但delete已释放过的非空指针不行
类中自定义new/delete需格外谨慎
重载类的operator new/delete时,必须确保与全局版本行为一致,并严格匹配数组/非数组版本。
- 若重载了operator new[],必须同时提供operator delete[]
- 异常安全要考虑:若构造函数抛异常,operator new分配的内存需由对应operator delete回收
- 除非有明确性能或布局需求,否则不建议自行重载
基本上就这些。核心是配对、匹配、自动化。写C++时少用裸new/delete,多靠RAII和智能指针兜底。
# 自动化
# ai
# 有一个
# 为空
# 自定义
# 对象
# 堆
# c++
# int
# 指针
# 构造函数
# red
# delete
# operator
# 类中
# 空指针
# 要严格
# color
# 少用
# ptr
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 为什么本地php环境运行php脚本卡顿_php执行
- Win11如何设置省电模式 Win11开启电池节电
- Python与OpenAI接口集成实战_生成式AI
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- mac怎么安装字体_MAC添加第三方字体与字体册管
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Win11怎么关闭触摸屏_禁用Win11笔记本触摸
- Win11怎么设置ip地址_Windows 11手
- c++ try_emplace用法_c++ map
- 如何在Golang中处理数据库事务错误_回滚和日志
- Win11怎么连接投影仪_Win11多显示器投屏设
- Go语言中CookieJar的持久化机制解析:内存
- c# 在高并发场景下,委托和接口调用的性能对比
- 如何使用Golang实现函数指针_函数变量与回调示
- php8.4如何配置ssl证书_php8.4htt
- php转mp4怎么保留字幕_php处理带字幕视频转
- c# 如何用c#实现一个支持优先级的任务队列
- 如何使用Golang包导出规则_控制函数和变量可见
- 如何使用Golang开发基础文件下载功能_Gola
- c++中explicit(bool)的用法 c++
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Python生成器表达式内存优化_惰性计算说明【指
- MySQL 中使用 IF 和 CASE 实现查询字
- PHP 中如何在函数内持久化修改引用变量的指向
- Win11怎么开启智能存储_Windows11存储
- 如何在Golang中实现基础配置管理功能_Gola
- php串口通信波特率怎么选_根据硬件手册设置正确波
- Windows7怎么找回经典开始菜单_Window
- Windows蓝屏错误0x00000018怎么处理
- Python数据挖掘进阶教程_分类回归与聚类案例解
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Win11如何卸载OneDrive_Win11卸载
- 如何正确访问 Laravel 模型或对象的属性而非
- XSLT怎么生成动态的HTML属性名和标签名
- 如何解决同一段404代码在不同主机上表现不一致的问
- php条件判断怎么写_ifelse和switchc
- php中::能访问全局变量吗_全局作用域与类作用域
- 如何在Golang中实现服务熔断与限流_Golan
- 如何在Golang中实现微服务服务拆分_Golan
- 如何使用Golang反射创建map对象_动态生成键
- Win11怎样安装企业微信_Win11安装企业微信
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Win11怎么关闭边缘滑动手势_Windows11
- 如何更改Windows资源管理器的默认启动位置?(
- 如何提升Golang程序I/O性能_Golang
- Mac的Time Machine怎么用_Mac系统
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- Win11怎么开启专注模式_Windows11时钟
- PHP主流架构怎么监控运行状态_工具推荐【操作】

移动后原指针自动为空)
QQ客服