QT 开发循环delete指针的安全操作

背景

在做TcpSocket例子的时候,发下移除QList<QTcpSocket *>后,第二次重新连接发现出现异常。经过排查发现,原来是deleteLater与delete有区别
image

原因分析

deleteLater 和 delete 都是在 Qt 中用于对象内存管理的关键方法,但它们的作用和使用时机有所不同。
deleteLater 用于安全异步删除对象,delete 用于立即释放对象内存。

  • deleteLater:
    作用:deleteLater 是一个槽函数,用于在事件循环中异步删除对象。它会安排对象在稍后的时间点被删除,通常是在当前事件处理完成后。
    使用场景:主要用于需要在当前上下文之外安全删除对象的情况,比如在槽函数中删除发出信号的对象,或者在涉及线程切换的情况下删除对象。
    注意事项:由于它是异步操作,因此不能保证对象会立即被删除。对象将在事件循环中被标记为删除,并在事件处理过程中完成删除操作。
  • delete:
    作用:delete 是 C++ 中用于手动释放对象内存的操作符。它会立即销毁对象,并释放其占用的内存。
    使用场景:通常在不需要对象时、对象的生命周期结束时使用,比如在函数结束时、对象不再需要时或者在析构函数中。
    注意事项:使用 delete 会立即释放对象的内存,如果之后再尝试使用这个对象,就会引发未定义行为(UB)或者内存错误。
posted @ 2024-08-16 16:44  一个小笨蛋  阅读(8)  评论(0编辑  收藏  举报