Изучение GTK +. Глядя на этот (измененный) пример из учебника:
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
// create the window and remember it as a simple pointer
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show(window);
gtk_main();
return 0;
}
Поскольку window - это указатель, который является new в gtk_window_new(), я решил, что поступлю правильно, и изменил его, чтобы он выглядел следующим образом (обратите внимание на использование unique_ptr):
#include <memory>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
// create the window but this time store it as a smart pointer
std::unique_ptr<GtkWidget> window(gtk_window_new (GTK_WINDOW_TOPLEVEL));
g_signal_connect(window.get(), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show(window.get());
gtk_main();
return 0;
}
Однако это дает сбой при удалении управляемого указателя:
*** Error in `example': free(): invalid pointer: 0x00005620c8cfc510 ***
fish: “example” terminated by signal SIGABRT (Abort)
Valgrind подтверждает, что проблема заключается в бесплатном вызове:
==00:00:00:21.223 17024== Invalid free() / delete / delete[] / realloc()
==00:00:00:21.223 17024== at 0x4C3123B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==00:00:00:21.223 17024== by 0x10F240: std::default_delete<_GtkWidget>::operator()(_GtkWidget*) const (/usr/include/c++/7/bits/unique_ptr.h:78)
==00:00:00:21.223 17024== by 0x10F6BE: std::unique_ptr<_GtkWidget, std::default_delete<_GtkWidget> >::~unique_ptr() (/usr/include/c++/7/bits/unique_ptr.h:268)
Итак, очевидно, что GTK + удаляет само окно !? Но управляет ли GTK + всеми указателями сам по себе? Или просто окна верхнего уровня? Или же...?
Обратите внимание, что в документации для gtk_window_new() не упоминается управление временем жизни объекта, поэтому я не понимаю, что делать с указателями, возвращаемыми различными функциями GTK +.
https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-new
Обновлено: подумать об этом больше - возможно, проблема вызвана std :: unique_ptr, использующим C++ delete вместо C free()?
Рассмотрите возможность использования gtkmm





GtkWidget наследуется от GOjbect, а GObject сам управляет памятью. См. developer.gnome.org/gobject/stable/gobject-memory.html