单击按钮时,全局变量包含垃圾
Global variable contains garbage when push button is clicked
#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);
}
};
代码的其他问题:
-
#include <QDebug>
,而不是<QtDebug>
-
#include <QMainWindow>
,而不是<qmainwindow.h>
- 最有可能的是,您不需要从
QMainWindow
派生对话;而是从QDialog
派生。 - 不要使用指向
ui
的指针;而是按值存储它。这样,您就有更少的代码可能出错:让编译器为您管理内存。这就是它的用途!
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 如何创建用于多个源文件的全局变量/包含/函数
- 当在其中定义全局变量时,如何在.cpp中包含 C 样式的 .h
- C 使用c库,其中包含标题文件中定义的全局变量
- 单击按钮时,全局变量包含垃圾
- 在 C++ 中包含和访问线程全局变量
- 包含文件会导致全局变量出现多个定义错误
- 在头文件中包含全局变量
- 编译器是否在全局符号表中包含没有静态修饰符的全局变量