ошибка сегментации — SIGSEGV на C ++ / Glade / gtkmm

Я создаю свое первое приложение с графическим интерфейсом на C ++, используя gtkmm и Glade.
Мне пришлось объединить различные учебники, потому что ни один из найденных мной не поддерживает 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.hpp

#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`

Результат в командной строке:

Начните

привет мир

Ошибка сегментации (ядро сброшено)

Отладка с помощью gdb (соответствующая выдержка, при необходимости вы получите полный вывод)

Glib :: RefPtr :: operator-> (this = 0x7fffffffdd10) по адресу /usr/include/glibmm-2.4/glibmm/refptr.h:260
260 return pCppObject_;

Поток 1 «основной» получил сигнал SIGSEGV, ошибка сегментации.

0x00007ffff7a4799e в Gtk :: Widget :: signal_hide () () из /usr/lib/x86_64-linux-gnu/libgtkmm-3.0.so.1

Поскольку я довольно новичок в C ++ (имею некоторый опыт работы с C #), я не очень привык к указателям. Где ошибка в этом случае?

Использование другого кода, где я создаю Window * и использую «app-> run (* window)», работает довольно хорошо, поэтому ошибка возникает где-то в новом app-> run () и аутсорсинге в классе «HelloWorld».

0

Решение

Ваш код вылетает здесь app->run(*helloworld);
Вы пытаетесь разыменовать пустой указатель. Этот указатель не указывает на объект в памяти.
Сделай это так:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]