편집 : 삭제 연산자를 추가해도 Valgrind 출력이 변경되지 않는 이유를 설명 할 수 있습니까? 제게 C++ 서적을 읽어달라고 부탁하지 마십시오. 저는 한 쌍을 살펴보고 대답을 찾지 못했습니다.C++의 메모리 누수가 삭제 명령문을 추가 한 후에 악화되는 것 같습니다
저는 C++을 처음 접했습니다. 자바 세계에서 왔기 때문에 새로운 연산자와 삭제 연산자를 사용하는 방법을 이해하는 데 어려움이 있습니다.
클래스 (MyClass)를 시작하는 메소드 (myMethod())가 있습니다. MyClass에는 new 및 new [] 연산자를 사용하여 몇 개의 배열과 몇 개의 다른 객체가 생성됩니다. 처음에는이 클래스에 대해 작성된 소멸자가 없었습니다. 컨트롤이 내 메서드에서 main으로 반환되면 MyClass 개체와 관련된 모든 것이 자동으로 "해제"됩니다.
내가 Valgrind의 내 프로그램을 실행, 이것은 내가 가진 누출 요약은 다음과 같습니다
==9446== LEAK SUMMARY:
==9446== definitely lost: 1,957,019 bytes in 38 blocks.
==9446== indirectly lost: 4,171,184 bytes in 3,040 blocks.
==9446== possibly lost: 0 bytes in 0 blocks.
==9446== still reachable: 91,984 bytes in 991 blocks.
==9446== suppressed: 0 bytes in 0 blocks.
==9446== Reachable blocks (those to which a pointer was found) are not shown.
==9446== To see them, rerun with: --show-reachable=yes
그래서 나는 모든 배열을 삭제하고 null로 개체를 설정하는 소멸자를 추가했다. 명시 적으로 MyClass 객체에서 delete를 호출하지 않습니다. 이제 Valgrind를 사용하여 프로그램을 실행하면 이것이 누수 요약입니다.
LEAK SUMMARY:
==9223== definitely lost: 1,957,019 bytes in 38 blocks.
==9223== indirectly lost: 4,171,184 bytes in 3,040 blocks.
==9223== possibly lost: 0 bytes in 0 blocks.
==9223== still reachable: 91,984 bytes in 991 blocks.
==9223== suppressed: 0 bytes in 0 blocks.
==9223== Reachable blocks (those to which a pointer was found) are not shown.
==9223== To see them, rerun with: --show-reachable=yes
명시 적으로 MyClass 개체를 삭제하면 손실 된 바이트의 수가 더 많습니다.
==9268== LEAK SUMMARY:
==9268== definitely lost: 3,353,187 bytes in 1,253 blocks.
==9268== indirectly lost: 28,376 bytes in 343 blocks.
==9268== possibly lost: 0 bytes in 0 blocks.
==9268== still reachable: 91,984 bytes in 991 blocks.
==9268== suppressed: 0 bytes in 0 blocks.
==9268== Reachable blocks (those to which a pointer was found) are not shown.
==9268== To see them, rerun with: --show-reachable=yes
난 MyMethod라는 (exitting에서 이전 메소드 freeMemory에서() 및 다음 호출 freeMemory에서()에 소멸자의 이름을 변경하려)이 누설 요약이다. 이것은 둘 중 하나보다 높습니다.
== LEAK SUMMARY:
==8998== definitely lost: 5,271,299 bytes in 1,205 blocks.
==8998== indirectly lost: 67,264 bytes in 410 blocks.
==8998== possibly lost: 0 bytes in 0 blocks.
==8998== still reachable: 91,984 bytes in 991 blocks.
==8998== suppressed: 0 bytes in 0 blocks.
==8998== Reachable blocks (those to which a pointer was found) are not shown.
==8998== To see them, rerun with: --show-reachable=yes
제 질문은 무슨 일입니까? Valgrind는 MyClass의 생성자와 MyClass의 메서드에서 누수가 있음을 나타냅니다. 누군가가 새 연산자와 삭제 연산자가 어떻게 작동하는지 설명 할 수 있습니까? 나는 명확한 자원을 온라인으로 찾을 수 없으므로, 누군가가 저를 그러한 자원으로 안내 할 수 있다면 그것은 또한 위대 할 것입니다!
좋은 초보자 C++ 서적에 앉아 있어야하는 것처럼 들립니다. 왜냐하면 여기에 기초가 분명하지 않기 때문입니다. – Falmarri
42 번 라인의 타월 작업자를 잊어 버렸습니다. –
관련 코드를 게시하십시오. –