gpt4 book ai didi

c++ - 单击按钮时全局变量包含垃圾

转载 作者:行者123 更新时间:2023-11-28 02:09:08 24 4
gpt4 key购买 nike

#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指向垃圾?

最佳答案

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 的指针;而是按值存储它。这样你就有更少的可能出错的代码:让编译器为你管理内存。这就是它的用途!

关于c++ - 单击按钮时全局变量包含垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36404527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com