Tôi đang cố gắng tìm hiểu gtkmm và quyết định thử gtkmm 2.4 trong thời gian này vì có vẻ như rất khó để có được 3.0 làm việc trên Debian. Dù sao, ví dụ tôi đang cố gắng là một ở đây: http://developer.gnome.org/gtkmm-tutorial/2.24/sec-helloworld.html.en. Nó biên dịch tốt và nó chạy là tốt không sao, nhưng khi tôi đóng nó valgrind báo cáo rất nhiều rò rỉ, một cái gì đó dọc theo dòng này (sau khi nhấp vào nút một lần):gtkmm/C++ bộ nhớ rò rỉ ví dụ thế giới đầu tiên
==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)
Điều này xảy ra nếu tôi dừng lại chương trình với Cc hoặc nhấp vào nút đóng cửa sổ (trong trường hợp này tôi phải sử dụng Shift-Meta-C để đóng cửa sổ vì trình quản lý cửa sổ). Đây có phải là hành vi mong đợi như trình kết nối của MySQL không cho phép bạn xóa một con trỏ cuối cùng không? Trong trường hợp đó, có vẻ như rất nhiều bộ nhớ không bị "cho phép" xóa? Hoặc tôi chỉ thiếu một cái gì đó thực sự đơn giản?
Vì lợi ích của nó ở đây là mã của tôi: (Thay đổi HelloWorld để Test) 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;
}
Cảm ơn trước!
Không phải là câu trả lời đúng cho câu hỏi gtk của bạn, nhưng nói chung khi điều tra rò rỉ bộ nhớ, hãy sử dụng 'valgrind --leak-check = full -leak-resolution = high --track-origins = yes' để biết thêm chi tiết. –
cung cấp cho tôi quá nhiều thông tin để có thể xử lý nó. tôi nên thêm một liên kết đến đầu ra? – lfxgroove
Tôi đề nghị bạn kiểm tra nó một cách cẩn thận và hiểu nó, nó sẽ hữu ích và một bài tập có giá trị sẽ giúp bạn trong tương lai. Một người khác có thể giải thích nó cho bạn nhưng nếu họ có thể làm điều đó thì bạn cũng vậy. Bạn có thể loại bỏ '--leak-resolution = high' để giảm đầu ra, nếu điều đó có ích. –