gpt4 book ai didi

c++ - 堆分配的 QApplication 被删除

转载 作者:行者123 更新时间:2023-12-03 06:53:54 26 4
gpt4 key购买 nike

在基本的 C++ Qt Widgets 应用程序中,在堆栈上创建一个 QApplication 或直接在 main 函数中对其进行堆分配是可行的,但是在堆上调用一个函数-分配一个 QApplication 并使用返回的指针给出一个段错误:

#include <QtWidgets>

QApplication* create_application(int argc, char* argv[]) {
return new QApplication(argc, argv);
}

int main(int argc, char* argv[]) {
QApplication* app = create_application(argc, argv);
QWidget window;
window.show();
app->exec();
}

我认为它被自动删除了,但我不明白为什么。

最佳答案

问题不在于您创建具有动态存储持续时间的QApplication,而是QApplication 的构造函数是QApplication::QApplication(int &argc, char **argv)argc为引用

还有这两个注释/警告:

Note: argc and argv might be changed as Qt removes command line arguments that it recognizes.

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.

在您退出该函数后,您的 create_application 中对 argc 参数的引用变得无效,这违反了该警告。

如果将 QApplication* create_application(int argc, char* argv[]) 更改为 QApplication* create_application(int &argc, char* argv[]) 它将起作用,因为 argc 现在引用 mainargc 参数,而不是它的拷贝。

关于c++ - 堆分配的 QApplication 被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64338030/

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