在为 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 的调用中)或参数数量:0
,这显然是错误的。
如果我使用 app = new QApplication(argc, argv)
实例化 app
(使用带有参数计数的无作用域变量)或删除 的声明/定义>settings
- 程序按预期输出Num of argument: 1
(这些更改中的任何一项都足够)。
我在Ubuntu
上使用Qt 5.5
,该项目是基于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)
最佳答案
Warning: The data referred to by argc and argv must stay valid for the entire lifetime of the QApplication object. In addition, argc must be greater than zero and argv must contain at least one valid character string."
From QT 5 Documentation 。强调我的。
tmp_argc
超出范围。
QApplication *app;
{
int tmp_argc = argc;
app = new QApplication(tmp_argc, argv);
} <-- BOOM!
关于c++ - 访问 QApplication::arguments 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566459/