Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt5抛出标准::错误分配_C++_Qt_C++11_Qt5_Qcustomplot - Fatal编程技术网

C++ Qt5抛出标准::错误分配

C++ Qt5抛出标准::错误分配,c++,qt,c++11,qt5,qcustomplot,C++,Qt,C++11,Qt5,Qcustomplot,我正在尝试在控制台应用程序中使用QCustomPlot。我首先为它创建了一个适合我使用的简单包装器。然而,包装器应该是这样的,每次我试图显示窗口时都会出现std::bad_alloc错误 这是我的代码,我在Plot.hpp中创建了一个包装器类: class Plot { private: std::string name; QApplication* app; QMainWindow* window; QCustomPlot

我正在尝试在控制台应用程序中使用QCustomPlot。我首先为它创建了一个适合我使用的简单包装器。然而,包装器应该是这样的,每次我试图显示窗口时都会出现std::bad_alloc错误

这是我的代码,我在
Plot.hpp
中创建了一个包装器类:

class Plot
{
    private:
        std::string name;
        QApplication* app;
        QMainWindow* window;
        QCustomPlot* plotWidget;
    public:
        Plot(std::string& name);
        // OTHER METHODS
        void showPlot();
};
int main()
{
    std::string title = "Testing";
    Util::Plot *plotWindow = new Util::Plot(title);
    // NO OTHER STATEMENTS
    plotWindow->showPlot();
    return 0;
}
在我的
Plot.cpp
文件中,我有以下内容:

Plot::Plot(std::string& name) : name(name)
{
    char *gui_argv[] = {(char*)(name.c_str()), NULL};
    int gui_argc = sizeof(gui_argv) / sizeof(char*) - 1;
    app = new QApplication(gui_argc, gui_argv);
    window = new QMainWindow();
    // Add plot Widget
    plotWidget = new QCustomPlot(window);
    window->setCentralWidget(plotWidget);
    plotWidget->plotLayout()->clear();
}

// OTHER METHODS

void Plot::showPlot()
{
    // Run the GUI
    window->show();
    app->exec();
}
我的
main.cpp中有以下内容:

class Plot
{
    private:
        std::string name;
        QApplication* app;
        QMainWindow* window;
        QCustomPlot* plotWidget;
    public:
        Plot(std::string& name);
        // OTHER METHODS
        void showPlot();
};
int main()
{
    std::string title = "Testing";
    Util::Plot *plotWindow = new Util::Plot(title);
    // NO OTHER STATEMENTS
    plotWindow->showPlot();
    return 0;
}
通过GDB我得到了这个堆栈跟踪,但我无法真正破译它以找到错误所在。它深入到QT的内部:

#0  0x00007ffff7279e97 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff727b801 in __GI_abort () at abort.c:79
#2  0x00007ffff78d08fb in  () at /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff78d6d3a in  () at /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff78d6d95 in  () at /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff78d6fe8 in  () at /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff529e402 in  () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#7  0x00007ffff530a22a in QListData::detach(int) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#8  0x00007ffff534475e in  () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#9  0x00007ffff549a48f in QCoreApplication::arguments() () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#10 0x00007fffef9e3791 in  () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#11 0x00007fffef9e3c8d in QXcbIntegration::wmClass() const () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#12 0x00007fffef9f8e03 in QXcbWindow::create() () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#13 0x00007fffef9e4bfb in QXcbIntegration::createPlatformWindow(QWindow*) const () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#14 0x00007ffff5a6229e in QWindowPrivate::create(bool, unsigned long long) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#15 0x00007ffff6245add in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#16 0x00007ffff624619d in QWidget::create(unsigned long long, bool, bool) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#17 0x00007ffff6252a96 in QWidget::setVisible(bool) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
# The following is line window->show()
#18 0x00007ffff7bd3179 in Util::Plot::showPlot() (this=0x55555576fd80) at ./lib/util/Plot.cpp:71
#19 0x00005555555549b3 in main() () at ./lib/test/PlotTest.cpp:16
我还验证了指向
window
app
plotWidget
的指针不为空。因此,基本上,只需创建
QMainWindow
并尝试在不执行任何其他操作的情况下显示它,就会导致此故障的发生。这里可能出了什么问题?我错过了什么

额外: 我不认为以下是问题的原因。但以防万一: 我没有使用QT-Studio,我已经编写了自己的makefile来构建
libQCustomPlot.so
和我自己的应用程序,并将它们链接到必要的QT库。编译过程中没有失败或警告

Edit1: 我忘了发布原始错误!仅以下内容,无其他信息/澄清:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

QApplication通过引用获取
argc
,并希望此引用在应用程序的生命周期内有效。一旦Plot函数结束,QApplication将保留对
gui_argc
的悬空引用,因此当调用QApplication::arguments时(如回溯中所示),将发生未定义的行为。您可以通过将
argc
持久化到某个地方来解决此问题。

是的,:警告:由
argc
argv
引用的数据必须在
QApplication
对象的整个生命周期内保持有效。问题出现在我的代码中,看起来像是竞争条件。无害的代码更改似乎可以在一段时间内修复它。谢谢你的解决方案!