请问,QT环境,如何判断一个对象的指针是否正常有效(不为空,也不是野指针等)

丰云 2022-02-18 08:47:56

如题,刚开始学习使用QT开发,从事软件开发行业后,一直使用高级语言开发,脱离c++环境十几年了,突然接触QT, 很多地方比较迷惑,请大神赐教

...全文
2480 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
勿为 2022-02-22
  • 打赏
  • 举报
回复 1

在定义时给对象赋值nullptr,使用时判断是否为nullptr。如

if(modbusDevice)
    {
        modbusDevice->disconnectDevice();
        delete modbusDevice;
        modbusDevice = nullptr;
    }

丰云 2022-02-23
  • 举报
回复
@勿为 谢谢
mideum 2022-02-18
  • 打赏
  • 举报
回复

不为空不就是!=NULL,野指针没办法判断吧,就算使用了智能指针,也不能禁止在其他地方delete的
要不就自己保证全都使用智能指针,不主动去delete

丰云 2022-02-21
  • 举报
回复
@mideum 谢谢
Qt源码剖析-智能指针 ⽬录 智能指针是什么? 智能指针是什么? 1. 智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利和强⼤的威⼒同时也给我们带来了很多隐患,所以指针也是把双刃剑。 常见的隐患有: 1. 我们在使⽤new创建⼀个对象的同时,由于种种原因⽽忘记了delete从⽽导致内存泄漏影响应⽤运⾏效率 2. 我们在使⽤⼀个指针的时候不知道该指针指向的对象是否已经析构,从⽽导致使⽤⼀个错误的指针。 针对上述问题Qt提供⼀组类模板(Smart指针类)来管理C++中的裸指针, 同时提供相关重载运算符使得使⽤起来与指针操作⽆异。 指针的⽣ 命周期也交由Smart类来管理⽽不⽤程序员⾃⼰去⼿动管理。使⽤Smart指针进⽽避免了上述隐患的存在。 Qt提供了哪些智能指针? 提供了哪些智能指针? QPointer、QSharedPointer、QScopedPointer、QWeakPointer、QSharedDataPointer、QExplicitlySharedDataPointer、 QGuard、QtPatternist::AutoPtr 由于Qt智能指针较多,避免篇幅较长本⽂只对平时使⽤场景较多的QSharedPointer源码进⾏分析也⽐较有代表性 QSharedPointer 官⽅介绍: QSharedPointer类持有对共享指针的强引⽤。QSharedPointer是c++中的⼀个⾃动共享指针。它的⾏为与⽤于普通⽬的的普通指针完全 相同,包括对constness的尊重。当指针超出作⽤域时,QSharedPointer将删除它所持有的指针,前提是没有其他QSharedPointer对象 引⽤它。QSharedPointer对象可以从普通指针、另⼀个QSharedPointer对象或通过将QWeakPointer对象提升为强引⽤来创建。 本⽂基于Qt5.12.4版本分析 QSharedPointer类模板 类模板(smart指针指针类)源码分析 源码分析 QSharedPointer类源码篇幅较长,避免出现阅读疲劳以下分段解读。 1. QSharedPointer类模板对于模板参数 类模板对于模板参数T的类型重定义 的类型重定义 template class QSharedPointer { typedef T *QSharedPointer:: *RestrictedBool; typedef QtSharedPointer::ExternalRefCountData Data; public: typedef T Type; typedef T element_type; typedef T value_type; typedef value_type *pointer; typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; typedef qptrdiff difference_type; }; QSharedPointer提供了部分公有和私有的对于模板参数T的类型重定义(说明: 这⾥T类型并不是指⼀个特定类型,⽽是⼀个通⽤/万能类 型。 我们可以把类模板看做成⼀个函数 QSharedPointer为函数名, template中类型列表的为函数形参列表,typedef 为返回值。 T最终 的类型确认待你使⽤时由编译器实例化模板时才能推导出),QSharedPointer类模板分别重定义了模板⼊参T的类型别名、指针、常指针、 引⽤、常引⽤类型。这也是模板的惯⽤⼿法和伎俩⽅便对于类型的获取和使⽤ 原因有以下⼏点: a. 提供公有的对于T的类型重定义⽅便的类外部获取和使⽤T及其衍⽣类型。 b. 类内部实现过程中统⼀,规范对于T的使⽤。 2. QSharedPointer的成员属性 的成员属性 template class QSharedPointer { // @1 Type *value; // @2 Data *d; }; QSharedPointer成员属性⽐较简洁代码段@1声明成员属性value(需要管理的裸指针), 代码段@2声明属性d。Data类型我们从第1点中可 知为QtSharedPointer::ExternalRefCountData 的类型别名。主要作⽤为记录当前持有value的QSharedPointer

16,803

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧