单击按钮时,全局变量包含垃圾

Global variable contains garbage when push button is clicked

本文关键字:包含垃 全局变量 按钮 单击      更新时间:2023-10-16
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
#include <iostream>
char * ip_ch;
void test(const char* a)
{
    qDebug()<<"test is "<<a;
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_lineEdit_editingFinished()
{
    QString st_ip_ch=ui->lineEdit->text();
    QByteArray ip_ch_temp = st_ip_ch.toLatin1();
    ip_ch = ip_ch_temp.data();
    qDebug()<<"ip_ch is "<<ip_ch;
    test(ip_ch);
}
void MainWindow::on_pushButton_clicked()
{
    qDebug()<<"when push button ";
    test(ip_ch);
}

代码使用以下 UI。我想像这样在行输入小部件中键入一些字符串,然后按下按钮。

它打印出这个:

ip_ch is  123
test is  123

单击按钮时,它会打印:

test is  `??`

为什么ip_ch指向垃圾?

ip_ch一旦

返回on_lineEdit_editingFinished()就会变成一个悬空的指针。这是因为您将其指向超出范围的临时缓冲区ip_ch_temp

ip_ch = ip_ch_temp.data(); // Don't do that!

由于您是用C++编码的,因此您不应该编写 C。 按值存储您的 Latin1 表示形式:

class MainWindow : public QMainWindow {
  QByteArray ip_ch;
  Ui::MainWindow ui;
public:
  MainWindow(QWidget * parent = 0) {
    ui.setupUi(this);
  }
  // no explicit destructor needed!
  void test(const QByteArray & data) { qDebug() << "test:" << data; }
  void on_lineEdit_editingFinished()
  {
    ip_ch = ui.lineEdit->test().toLatin1();
    qDebug() << "ip_ch is" << ip_ch;
    test(ip_ch);
  }
  void on_pushButton_clicked()
  {
    qDebug() << "button was pushed";
    test(ip_ch);
  }
};

代码的其他问题:

  1. #include <QDebug>,而不是<QtDebug>
  2. #include <QMainWindow>,而不是<qmainwindow.h>
  3. 最有可能的是,您不需要从QMainWindow派生对话;而是从QDialog派生。
  4. 不要使用指向ui的指针;而是按值存储它。这样,您就有更少的代码可能出错:让编译器为您管理内存。这就是它的用途!