2012-05-17 5 views
6

나는 gtkmm을 배우려고하는데, 데비안에서 3.0을 사용하는 것이 꽤 힘들어서 gtkmm 2.4를 사용하기로 결정했습니다. 어쨌든, 제가 시도하고있는 예제는 여기에 있습니다 : http://developer.gnome.org/gtkmm-tutorial/2.24/sec-helloworld.html.en. 그것은 잘 컴파일이 괜찮아 aswell를 실행,하지만 난 닫을 때 그것은 Valgrind의, (한 번 버튼을 클릭 한 후)이의 라인을 따라 뭔가 누수를 많이보고 : 내가 프로그램을 중지하면gtkmm/C++ 첫 번째 안녕하세요 세계 누수 메모리

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

이 발생을 참조 또는 창 닫기 버튼을 클릭하십시오 (이 경우 Shift-Meta-C를 사용하여 창 관리자 때문에 창을 닫아야합니다). 이것은 마지막 포인터 하나를 지울 수없는 MySQL 커넥터와 같은 예상 된 동작입니까? 이 경우 많은 양의 메모리가 "허용"되지 않은 것처럼 보입니다. 아니면 나는 정말 간단한 것을 놓치고 있습니까? 그것의 위해서

여기 내 코드입니다 : (테스트로 변경하여 HelloWorld) 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; 
} 

미리 감사드립니다.

+0

gtk 질문에 대한 적절한 답변이 아니지만 일반적으로 메모리 누수를 조사 할 때 자세한 내용을 확인하려면 'valgrind --leak-check = full --leak-resolution = high --track-origins = yes'을 사용하십시오. –

+0

그 정보를 처리 할 수있는 정보가 너무 많습니다. 출력에 링크를 추가해야합니까? – lfxgroove

+1

신중히 검토하고 이해하면 나중에 유용 할 유용한 운동이 될 것입니다. 다른 사람이 당신을 위해 그것을 해석 할 수 있지만 그렇게 할 수 있다면 당신도 할 수 있습니다. 출력을 줄이기 위해'--leak-resolution = high'를 제거하면 도움이 될 것입니다. –

답변

3

동적 메모리 할당이 없다는 것을 감안할 때 코드에서 누출이 누출되지는 않습니다. Test t 변수를 동적으로 스택에 정의했기 때문에 범위를 벗어나면 변수가 삭제됩니다. main() 함수가 완료 될 때, 실제로는 전체 프로그램이 완료되기 전에 수행됩니다. Test 클래스에는 직접 동적 메모리 할당도 없습니다. 직접적으로 언급하자면 해당 클래스에서 직접 의미하지만 속성에 포함되지는 않습니다 (gtk 등).

테스트 인스턴스가 실제로 삭제된다는 것을 보여주기 위해 소멸자에 printf를 넣을 수 있습니다. 응용 프로그램이 종료되면 출력이 표시됩니다.

는 정의했다하더라도/테스트 인스턴스를 동적으로 생성, 당신은 당신이 만드는 모든 것을 삭제 항상의 습관을해야한다. 이 경우 메모리 만 있으면되지만 DB 연결, 파일 시스템 리소스 또는 종료시 실행해야하는 다른 논리와 같은 더 중요한 리소스가 될 수 있습니다.

Valgrind가 실제 메모리 누수가 발생하는 곳의 스택 추적을 제공 할 수 있습니다. Im은 gtk 코드에 있음을 확인할 수 있습니다. 그렇다면 버그를 제기하는 것이 좋습니다. 나는 still reachable 메모리 (실제로 누수가 아님)에 대해 너무 걱정하지 않고 대신 definitely lostindirectly lost을 조사한다.

+0

아직도 도달 할 수있는 것이 실제 누출이 아닌 이유를 설명해 주시겠습니까? 또한 Valgrind를 --show-origin = yes로 실행 시켰습니다. gtk뿐 아니라 카이로와 판고도 대부분 보여줍니다. 거기에 버그 보고서도 첨부해야합니까? 미리 감사드립니다! – lfxgroove

+0

@Anton, 메모리 누수는 더 이상 액세스 할 수없는 메모리입니다. 메모리에 대한 포인터가 있으면 메모리를 비우지 않고도 포인터에 다른 값을 할당하여 주소를 "잃어 버리는"것입니다. 여전히 도달 할 수있는 메모리는 여전히 포인터에 의해 참조되는 메모리이며 프로그램이 종료되므로 메모리가 "손실"되지 않습니다. 버그에 관해서는 그렇다고 대답 하겠지만, gtk가 라이브러리를 올바르게 관리하지 못해 거부 할 수 있습니다. 버그를 신고 할 때 Valgrind stacktrace를 보여 주면 감사하겠습니다. – Brady

+0

@Anton, "Still Reachable"은 누수만큼 심각한 것은 아니지만 이상적으로는 여전히 해결되어야한다고 언급해야합니다. – Brady

1

GSlice 메모리 할당자를 재구성하기 위해 G_SLICE 환경 변수를 설정하십시오.

G_SLICE=always-malloc ./your_application 

자세한 내용은 this post을 참조하십시오.

+0

나는 G_SLICE = always-malloc과 G_DEBUG = gc-friendly [, resident-modules]를 사용하여 많은 도움을주지 못하며 언급 된 억 제기 파일을 다운로드했다. – lfxgroove

2

Gtk-- 메모리가 누출되지 않는다고 가정하면 게시 한 출력이이 가정과 호환 될 수 있습니다.

프로그램 종료시 일부 메모리에 여전히 도달 할 수 있다는 사실은 메모리 누수와 같은 것은 아닙니다.

메모리 누수가 발생합니까?

int main() { 
    int* a = new int[10]; 
    return 0; 
} 

전체 응답은 다음과 같아야합니다.

우리는 MS/DOS 및 사용하지 않는 경우 "A"프로그램의 매우 끝날 때까지 필요한 것은이 거의 누출을 정의 할 수 없습니다 ... 우리는 프로그래머가 깨끗한에 대한 책임을 왼쪽으로 말할 수 기본 운영 체제.

또한 Valgrind는 매우 유용하고 유용한 도구이지만 오 탐지를보고 할 수 있습니다.

+0

그래서 당신이 말하는 것은 그들이 마지막 메모리 조각을 정리할 수 없으며 그 메모리를 기본 os에 남겨 둘 수 없다는 것입니다. 거기에 어떤 종류의 문서가 있습니까? 또한 평소입니까? – lfxgroove

+0

나는 일반적인 발언을하고 있었고, gtkmm 개발자들에게는 말할 수 없다. 나는 그들이 의도 한 바를 물어볼 적절한 곳이 우편 목록이라고 생각합니다. – baol

관련 문제