7 Stimmen

gtkmm/c++ erstes Hallo-Welt-Beispiel leckt Speicher

Ich versuche, gtkmm zu lernen, und beschloss, gtkmm 2.4 vorerst zu versuchen, da es ziemlich schwierig zu sein scheint, 3.0 unter Debian zum Laufen zu bringen. Wie auch immer, das Beispiel, das ich versuche, ist die eine hier: http://developer.gnome.org/gtkmm-tutorial/2.24/sec-helloworld.html.en . Es kompiliert gut und es läuft auch gut, aber wenn ich es schließe, meldet valgrind eine Menge von Lecks, etwas entlang der Linien von diesem (nach dem Klicken der Schaltfläche einmal):

==4254== Memcheck, a memory error detector
==4254== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==4254== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==4254== Command: ./bin/jmb
==4254== 
Hello World
==4254== 
==4254== HEAP SUMMARY:
==4254==     in use at exit: 942,940 bytes in 7,968 blocks
==4254==   total heap usage: 14,191 allocs, 6,223 frees, 3,272,961 bytes allocated
==4254== 
==4254== LEAK SUMMARY:
==4254==    definitely lost: 2,620 bytes in 6 blocks
==4254==    indirectly lost: 5,936 bytes in 187 blocks
==4254==      possibly lost: 358,625 bytes in 1,775 blocks
==4254==    still reachable: 575,759 bytes in 6,000 blocks
==4254==         suppressed: 0 bytes in 0 blocks
==4254== Rerun with --leak-check=full to see details of leaked memory
==4254== 
==4254== For counts of detected and suppressed errors, rerun with: -v
==4254== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 9 from 9)

Das passiert, wenn ich das Programm mit C-c beende oder auf die Schaltfläche Fenster schließen klicke (in diesem Fall muss ich wegen des Fenstermanagers Shift-Meta-C verwenden, um das Fenster zu schließen). Ist dies das erwartete Verhalten wie der MySQL-Connector, der es nicht erlaubt, den letzten Zeiger zu löschen? In diesem Fall scheint es eine Menge Speicher zu sein, der nicht gelöscht werden "darf"? Oder übersehe ich nur etwas wirklich einfaches?

Zur Veranschaulichung ist hier mein Code: (HelloWorld wurde in Test geändert) main.cpp:

#include "gui/Test.hpp"
#include <gtkmm/main.h>
int main(int argc, char **argv)
{
  Gtk::Main kit(argc, argv);
  Test t;
  Gtk::Main::run(t);
  return 0;
}

Test.hpp:

#pragma once

#include <gtkmm/button.h>
#include <gtkmm/window.h>

class Test
  : public Gtk::Window
{
public:
  Test();
  virtual ~Test();

protected:
  //Signal handlers:
  void on_button_clicked();

  //Member widgets:
  Gtk::Button m_button;
};

Test.cpp:

#include "Test.hpp"
#include <iostream>

Test::Test()
  : m_button("Hello World")   // creates a new button with label "Hello World".
{
  // Sets the border width of the window.
  set_border_width(10);

  // When the button receives the "clicked" signal, it will call the
  // on_button_clicked() method defined below.
  m_button.signal_clicked().connect(sigc::mem_fun(*this,
              &Test::on_button_clicked));

  // This packs the button into the Window (a container).
  add(m_button);

  // The final step is to display this newly created widget...
  m_button.show();
}

Test::~Test()
{

}

void Test::on_button_clicked()
{
  std::cout << "Hello World" << std::endl;
}

Vielen Dank im Voraus!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X