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

时间:2016-04-04 13:48:42

标签: c++ qt

#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);
}

代码使用the following UI。我想在行输入窗口小部件like this中键入一些字符串,然后按下按钮。

打印出来:

ip_ch is  123
test is  123

单击按钮时,将打印:

test is  `??`

为什么ip_ch指向垃圾?

1 个答案:

答案 0 :(得分:2)

ip_ch返回后,

on_lineEdit_editingFinished()成为悬空指针。那是因为你让它指向超出范围的临时缓冲区ip_ch_temp

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

由于你是用C ++编写的,所以你不应该写C.用value存储你的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的指针;而是通过价值来存储它。这样你就可以减少可能出错的代码:让编译器为你管理内存。这就是它的用途!