在为gui编写包含qt
的程序时,我偶然发现了一个问题,可以使用下面的最小代码复制:
#include <iostream>
#include <QApplication>
#include <QSettings>
using namespace std;
int main(int argc, char ** argv) {
QApplication *app;
{
int tmp_argc = argc;
app = new QApplication(tmp_argc, argv);
}
QSettings settings("testvendor");
cout<<"Num of arguments: "<<app->arguments().count()<<std::endl;
return 0;
}
在核心转储(在调用QApplication :: arguments中)或Num of arguments: 0
中运行结果,这显然是错误的。
如果我使用app
实例化app = new QApplication(argc, argv)
(使用带有参数计数的未编码变量)或删除settings
的声明/定义 - 程序按预期输出Num of arguments: 1
(这些变化中的任何一个都足够了。)
我在Qt 5.5
上使用Ubuntu
,项目基于cmake
,CMakeLists.txt
的内容:
cmake_minimum_required(VERSION 3.3)
project(qtest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_PREFIX_PATH /opt/Qt/6.5.1/gcc_64/)
find_package(Qt5Widgets REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(qtest ${SOURCE_FILES})
target_link_libraries(qtest Qt5::Widgets)
答案 0 :(得分:4)
警告: argc 和argv 引用的数据必须在QApplication对象的整个生命周期内保持有效。此外,argc必须大于零,并且argv必须至少包含一个有效的字符串。“
From QT 5 Documentation。强调我的。
tmp_argc
超出了范围。
QApplication *app;
{
int tmp_argc = argc;
app = new QApplication(tmp_argc, argv);
} <-- BOOM!
答案 1 :(得分:1)
以下是如何修复它,符合QCoreApplication
构造函数文档中给出的要求:
// https://github.com/KubaO/stackoverflown/tree/master/questions/app-args-35566459
#include <QtCore>
#include <memory>
std::unique_ptr<QCoreApplication> newApp(int & argc, char ** argv) {
return std::unique_ptr<QCoreApplication>(new QCoreApplication{argc, argv});
}
int main(int argc, char ** argv) {
std::unique_ptr<QCoreApplication> app(newApp(argc, argv));
QSettings settings{"testvendor"};
qDebug() << "Num of arguments: " << app->arguments().count();
}