SIGSEGV on C++/Glade/gtkmm

SIGSEGV on C++/Glade/gtkmm

本文关键字:Glade gtkmm C++ on SIGSEGV      更新时间:2023-10-16

我正在使用gtkmm和Glade用C++创建我的第一个GUI应用程序。我不得不合并各种教程,因为我发现没有一个教程支持Glade与Gtk::Application和各种类相结合。请参阅以下代码:

main.cpp

int main(int argc, char **argv)
{
    std::cout << "Start" << std::endl;
    auto app = Gtk::Application::create(argc,argv,"org.gtkmm.ex");  
    auto builder = Gtk::Builder::create();
    builder->add_from_file("gui02.glade");
    HelloWorld* helloworld;
    std::cout << "helloworld compl." << std::endl;
    app->run(*helloworld);

    return 0;
}

helloworld.pp

#include <gtkmm.h>
class HelloWorld : public Gtk::Window
{
protected:
    Glib::RefPtr<Gtk::Builder> builder;
    Gtk::Button *btn1;
    Gtk::Label *lb1;
public:
    HelloWorld(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
protected:
    void on_button1_clicked();
};

helloworld.cpp

#include "helloworld.hpp"
using namespace std;
using namespace Gtk;
HelloWorld::HelloWorld(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) : 
    Gtk::Window(cobject), builder(refGlade)
{
    builder->get_widget("label1", lb1);
    builder->get_widget("button1", btn1);
    btn1->signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button1_clicked));
}
void HelloWorld::on_button1_clicked()
{
    lb1->set_text("HW!");
}

编译使用:

g++ main.cpp helloworld.cpp -o main `pkg-config gtkmm-3.0 --cflags --libs`

命令行中的结果:

启动

helloworld compl。

分段故障(堆芯转储(

使用gdb调试(相关摘录,必要时可获得完整输出(

Glib::RefPtr::operator->(this=0x7fffffdd10(,位于/usr/include/glibmm-2.4/glibmm/RefPtr.h:260260返回pCppObject_;

线程1"主"接收信号SIGSEGV,分段故障。

来自/usr/lib/x86_64-linux-gnu/libgtkm-3.0.so.1 的Gtk::Widget::signal_hide((中的0x00007ffff7a4799e

因为我对C++很陌生(对C#有一些经验(,所以我不太习惯指针。这种情况下的错误在哪里?

使用另一个代码,我创建了一个Windows*并使用"app->run(*Window("工作得很好,所以错误发生在新的app->run((和类"HelloWorld"中的外包中。

您的代码在此处崩溃app->run(*helloworld);您试图取消引用一个空指针。该指针不指向内存中的对象。这样做:

HelloWorld* helloworld = new HelloWorld();
std::cout << "helloworld compl." << std::endl;
app->run(*helloworld);