ruyulin 2018-01-23 14:08 采纳率: 100%
浏览 4424
已采纳

QT局部变量内存释放问题

图片说明

上图圈红的代码,按钮不显示。我可以理解为。函数调用栈内存释放。导致按钮对象被释放。

图片说明

这个图中的QPainter q
不是也是局部变量对象么,为什么就能将资源图片显示到窗体上呢?

由于这两个的区别,我有点不确定以后开发,应该如何构建对象了。我是C++、QT新手。不知道哪个知识没有学到位,请各位大拿指点下,谢谢。

  • 写回答

4条回答 默认 最新

  • QRick 2018-01-23 15:15
    关注

    问题1:楼主分析的很对,确实是栈上的被释放
    T推荐是在堆中申请内存
    就是QPushButton *pushbutton=new QPushButton();

    基本qt里面的layout啊,widget啊editline啊云云各种控件啊布局啊,还有animation啊musicplayer啊
    都是推荐使用new的,到时候可以在构造函数里面写个this->setAttribute(Qt::WA_DeleteOnClose);
    再在析构函数里面统一析构

    问题2:这里的p是栈上的,但是它调用drawPixmap时候是对ui进行操作的。p没了但是ui还在
    看这句话
    头文件的 Ui::Widget *ui;
    再在构造函数的实现看new Ui::Widget
    可以看出ui是堆中的
    就像A改变B,A消失了,但是在B身上的痕迹不会消失。除非析构B。
    举个实例就是
    A*a=new A()
    void fun()
    {
    b=3
    a.任意属性=b
    }
    是的b'没了但是a改变了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵