Пример gtkmm/c++ first hello world с утечкой памяти

Я пытаюсь изучить gtkmm и решил пока попробовать gtkmm 2.4, так как его довольно сложно получить. 3.0 работает на Debian. Во всяком случае, пример, который я пытаюсь использовать, приведен здесь: http://developer.gnome.org/gtkmm-tutorial/2.24/sec-helloworld.html.en. Он отлично компилируется и работает нормально, но когда я его закрываю, valgrind сообщает о множестве утечек, что-то вроде этого (после однократного нажатия кнопки):

==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)

Это происходит, если я останавливаю программу с помощью Cc или нажимаю кнопку кнопка закрытия окна (в этом случае я должен использовать Shift-Meta-C, чтобы закрыть окно из-за оконного менеджера). Является ли это ожидаемым поведением, как коннектор MySQL, который не позволяет вам удалить этот последний указатель? В этом случае кажется, что много памяти не «разрешено» удалять? Или я просто пропустил что-то очень простое?

Вот мой код: (Изменил HelloWorld на Test) main.cpp:

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

Test.hpp:

#pragma once

#include 
#include 

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 

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;
}

Заранее спасибо!

7
задан lfxgroove 21 May 2012 в 14:11
поделиться