Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

本文主要是介绍Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

珍爱生命,远离悬空指针。

正文

delete

  • 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。
  • 调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。
  • 无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。
  • 适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的删除。
MyWidget *widget = new MyWidget();
delete widget;  // 立即删除对象并释放内存

deleteLater

  • 延迟删除deleteLater 并不会立即销毁对象,而是将销毁任务放入 事件队列,等到当前和其他相关的事件处理完成后才会销毁对象。
  • 异步安全:它适用于对象正在执行某些操作(例如正在响应信号、槽或事件)的情况下,防止对象在事件处理过程中被意外删除而导致崩溃。
  • 事件循环依赖deleteLater 依赖于事件循环(event loop),只有在事件循环的下一个迭代时才会删除对象。如果没有事件循环,该对象可能不会被删除。
  • 适用场景:适用于正在处理事件或信号槽连接的对象,或者需要确保对象在当前操作结束后才安全地删除。
MyWidget *widget = new MyWidget();
widget->deleteLater();  // 延迟删除,等到事件处理完成后才会销毁

不同点总结

  1. 删除时机

    • delete 是同步的,立即删除对象。
    • deleteLater 是异步的,等到事件循环完成后再删除对象。
  2. 使用场景

    • delete 适合在确定对象不会再被使用时直接销毁。
    • deleteLater 适合对象正在处理事件或信号时使用,避免在对象处理完毕之前被删除。
  3. 事件安全性

    • delete 可能会在处理事件时导致崩溃,因为对象会立即被删除。
    • deleteLater 避免了这个问题,确保事件处理完成后再销毁对象。

例子

例如,如果你有一个正在运行的 QWidget,它正在处理某个事件,这时使用 delete 会立即删除该对象,导致未定义行为或崩溃。如果用 deleteLater,对象会等到事件处理完成后再删除。

void MyWidget::someSlot() {// 如果这里直接 delete this,可能导致崩溃// delete this;// 使用 deleteLater 可以安全地删除对象this->deleteLater();
}

相同点总结

二者在销毁对象后,尤其是指针指向的对象,只是释放了指针指向的内存,指针仍然会保留其先前的地址,其指针本身并不会被置为nullptr,此时指针就处于悬空状态,被称为悬空指针,网上和书上说访问悬空指针会造成未定义行为,我遇到最多的情况就是程序异常终止,让你摸不着头脑。所以说在将指针释放掉后,一定一定一定要指向nullptr,这在你编程的时候会避免很多问题。

小结

这篇关于Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147424

相关文章

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.