2011-08-22 6 views
1

저는 메모리 처리에 익숙하지 않지만 현재 Qt Nokia SDK를 사용하여 Symbian 장치 용 응용 프로그램을 개발하는 Qt 프로젝트 (C++)를 작업 중입니다.메모리 누수를 처리하는 방법은 무엇입니까?

플랫폼 : 윈도우 7

1'st 질문 : 내가 이런 푸시 버튼 생성하는 경우 :

QPushButton을 * 버튼 = 새로운 QPushButton을 (부모);

삭제해야하나요? (나는 UI의 일부이기 때문에, 아니라고 생각하지만, 내가 틀렸다면 나에게 맞춰라.)

2nd 질문 : 메모리 누수를 어떻게 찾을 수 있습니까?이 문제를 해결하는 데 도움이되는 좋은 프로그램을 알고 계십니까?

내가 노키아 분석 도구를 사용하여 시도했다

,하지만 난 atool를 실행하면

atool.exe 내가 그냥 얻을

phoneMeomoryLog

-f armv5 udeb을 구축 -LF

빌드 유형 : udeb 빌드 플랫폼 : armv5 데이터 수집 모드 : 에 로그 파일 할당 스택 크기 : 40 무료 호출 스택 크기 : 0 지연된 무료 : 기능 dis abled 힙 손상 검사 (guard blocks) : 기능 비활성화 됨 AnalyzeTool : 오류, makefile 작성/읽기.

누군가 나를 대답 할 수 있기를 바랍니다. 첫 번째 질문에 대한 사전

답변

1
  1. 이 질문에

    덕분에 윈도우의 표준 GUI 개체는 달리, Qt는 당신이 그것을 삭제하지 않도록 보인다 호입니다. 기본 창이 닫히면 해제됩니다.

  2. VS에 포함 된 Microsoft의 메모리 링크 감지기를 사용할 수 있습니다. this link에서 더 자세한 내용을 찾으십시오.

+0

Qt 프로그램에서이 기능을 사용해 보셨습니까? – Ikky

-1

음, Qt Nokia SDK에 대한 경험이 없지만 C++ 지식을 기반으로합니다.

  1. 예. 새 것으로 창조 된 모든 것은 나중에 해방되어야합니다. 포인터는 자체적으로 해제 할 수 없으며 C++에서는 가비지 수집기를 제공하지 않습니다.

  2. 몇 가지가 있습니다. 예를 들어, 님이 새로운 소식을 확인하고 이 (가) 번에 얼마나 많은 사람이 있는지 확인하십시오. 새로울 때마다 어딘가에 삭제해야합니다. 사용 된 메모리를 확인하십시오 : 사용되는 메모리가 커지거나 절대로 줄어들지 않으면 메모리가 올바르게 처리되지 않습니다. 소멸자에 할당 된 자원을 삭제했는지 확인하십시오.

auto-pointers

2

1'st 질문을 사용할 수 있습니다이를 방지하려면, 아니 당신이 그것을 제거 할 필요가 없습니다. 부모가 삭제되면 삭제됩니다. 따라서 폼이나 대화 상자 인 부모를 삭제해야합니다.

Qt::WA_DeleteOnClose 플래그로 대화 상자를 만들 때 위젯이 닫기 이벤트를 수락하면이 위젯이 삭제됩니다. 따라서 메모리 누수가 발생하지 않습니다.

그래서이 플래그로 대화 상자를 만들고 지금하고있는 것처럼 위젯을 추가하면 괜찮을 것입니다.

2nd 질문 : Linux에서 실행중인 경우 valgrind를 사용하십시오.

예 : Valgrind의 --tool = memcheck --leak 검사 = 예 ./myprogramname

Valgrind의 당신이 미세 조정에 사용할 수있는 많은 옵션이 있습니다.

또한 오래된 C++ 또는 QScopedPointer을 사용하는 경우 * unique_ptr * 또는 * auto_ptr *을 사용하면 메모리 누수를 피할 수있는 좋은 프로그래밍 기법입니다.

+0

Valgrind를보고 있습니다. 지금 Qt SDK를 리눅스에 설치하여 그것을 확인할 수 있습니다. 모든 해답을 주셔서 감사합니다. 정말 도움이됩니다. – Ikky

+0

일부 포인터는 new로 메모리를 할당받습니다. 나중에 삭제해야합니다. 부모는 메모리가 아니라 UI 리소스를 출시합니다 !!! – hsalimi

+3

QT의 http://doc.qt.nokia.com/4.6/objecttrees.html (개체 트리 및 개체 소유권)을 읽어보십시오. 명시 적으로 "다른 객체를 부모로 가지는 QObject를 만들면 부모의 children() 목록에 추가되고 부모가있을 때 삭제됩니다." –

0

둘 다 "기본 창을 닫을 때 해제됩니다." "부모님은 메모리가 아닌 UI 리소스를 출시합니다 !!! - hsalimi"가 잘못되었습니다. 부모는 자식 목록을 유지하고 자식 자체가 파괴 될 때 삭제합니다. 이것은 "UI 리소스"또는 "메인 윈도우"와는 아무런 관련이 없으며 일반적인 QObject 동작입니다. std :: auto_ptr도 여기에 필요하거나 유용하지 않습니다.

관련 문제