문제

나는 느낌과 같은 개발자들에 대해 이야기는 메모리 누수 하지만 당신이 그들에게 무엇을 의미하는 많은 아무 생각이 없습니다.이 문제를 방지하기 위해 상황,결정에 하나입니다.

시키 정의...

무엇이 당신의 가장 정의 메모리 누수 고는 무엇입 가장 좋은 방법 을을 방지할 수 있을까요?

도움이 되었습니까?

해결책

두 가지 정의가 있습니다 (적어도 나를 위해) :

순진한 정의 : 석방 실패 도달 할 수없는 할당 프로세스를 실행하는 동안 어떤 프로세스에 의해 다시 할당 될 수없는 메모리. 이것은 대부분 GC (Garbage Collection) 기술을 사용하여 치료하거나 자동화 된 도구로 감지 할 수 있습니다.

미묘한 정의 : 석방 실패 도달 할 수 있습니다 프로그램이 올바르게 작동하기 위해 더 이상 필요하지 않은 메모리. 이는 자동화 된 도구 또는 코드에 익숙하지 않은 프로그래머로 감지하는 것이 거의 불가능합니다. 기술적으로는 누출이 아니지만 순진한 것과 동일한 영향을 미칩니다. 이것은 내 자신의 아이디어가 아닙니다. 쓰레기 수집 된 언어로 작성된 프로젝트를 발견 할 수 있지만 여전히 ChangeLogs에서 메모리 누출을 고치는 것을 언급 할 수 있습니다.

다른 팁

참조에 대한 참조가 손실 되었기 때문에 사용할 수없는 메모리 할당 된 메모리.

메모리 리소스가 할당되어 있고 더 이상 필요하지 않은 프로세스가 더 이상 필요하지 않은 프로세스는 종종 나쁜 코딩 관행을 통해 도입됩니다.

일부 언어에는 방지하는 데 도움이되는 방법이 있지만, 피하는 가장 좋은 방법은 코드 실행 경로 및 코드 검토를 부지런히 관찰하는 것입니다. 방법을 짧고 특이하게 정리하는 방법을 유지하면 자원 사용이 단단히 범위를 유지하고 셔플에서 길을 잃기 쉬운 경향이 있습니다.

정의: 할당 후 메모리를 해제하지 못합니다.

W :

컴퓨터 과학에서 메모리 누출은 컴퓨터 프로그램에 의한 특정 유형의 의도하지 않은 메모리 소비입니다.이 프로그램은 더 이상 필요할 때 메모리를 해제하지 못하는 컴퓨터 프로그램입니다. 이 조건은 일반적으로 프로그램의 버그의 결과입니다. 프로그램은 더 이상 필요하지 않은 메모리를 제거하지 못하게합니다.

더 이상 필요하지 않을 때 거래되지 않고 더 이상 "도달 할 수없는"메모리. 예를 들어, 관리되지 않는 코드에서 "새"를 사용하여 객체를 인스턴스화하지만, 완료되면 "삭제"를 사용하지 않습니다 (그리고 내 포인터가 범위 나 전환되지 않았습니다).

그것들을 방지하는 가장 좋은 방법은 아마도 당신이 물어 보는 사람과 어떤 언어를 사용하는지에 달려 있습니다. 물론 쓰레기 수집은 좋은 솔루션이지만, 이와 관련된 오버 헤드가있을 수 있습니다. 이는 성능이 주요 관심사가 아니라면 큰 문제가되지 않습니다. 사용중인 언어에 따라 쓰레기 수집을 항상 사용할 수있는 것은 아닙니다.

또는 적절한 삭제 및/또는 소멸자가 있는지 확인할 수 있습니다. 메모리 누출을 감지하는 방법과 도구가 많이 있지만 사용중인 언어 및/또는 IDE에 따라 다릅니다.

메모리 누출: 더 이상 필요하지 않은 메모리를 자유롭게하지 않으면 :

  • 프로그램이 종료됩니다
  • 추가 메모리가 할당됩니다

메모리 누출을 방지하는 가장 좋은 방법: 더 이상 필요하지 않은 즉시 무료 메모리.

는 방법은 두 가지가 있는 메모리 누수가 정의될 수 있다.

첫째,만약 데이터가 해제되지 않습 있을 경우는 더 이상 어떤 것은 그것을 참조하는 데이터가 연결할 수 없는(있는 경우 이외에는 손상 또는 포인터를 읽는 과거의 버퍼에 데이터 또는 뭔가).기본적으로,지 않을 경우 무료로/삭제 데이터 힙에 할당되어,그것은 사용할 수 없게되고 단순히 폐기물 메모리입니다.

가 있는 경우 포인터가 손실되었지만 데이터는 여전히 접근할 수 있습니다.예를 들어,당신이 상점에서 포인터 int,또는 저장 오프셋 포인터를 사용하여(포인터 연산),당신은 여전히 얻을 수 있습니다 원래 포인터이다.

이 첫 번째 정의,데이터 처리하는 쓰레기 수집가는 유수의 참조 데이터입니다.

둘째,메모리가 기본적으로 유출하지 않은 경우 해제/삭제 마지막 때 사용됩니다.그것을 참조할 수 있습,즉시 무료 할 수있다,그러나 실수를 했지 않습니다.이 있을 수 있습 유효한 이유(예:는 경우에는 소멸자가 어떤 이상한 부작용),하지만 나타내는 나쁜 디자인 프로그램(제 생각에).

이 두 번째 유형의 메모리 누수가 종종 때 발생하는 작은 프로그램을 사용하는 파일 IO.당신은 파일을 열고,쓰고,데이터,하지만 가까운 그것은 일단 당신이 완료됩니다.파일을*여전히 수 있습 범위 내에서,그리고 쉽게 닫기 가능.다시될 수 있습이 어떤 이유로 이 일을 위해(등과 같은 잠그는 쓰기 권한에 의해 다른 프로그램),하지만 나에게는 국기의 디자인이다.

에서 이 두 번째 정의,데이터 처리되지 않으로 쓰레기 수집가지 않는 한,컴파일러/스마트 인터프리터가(또는 벙어리)충분히 알고 그것이 사용되지 않습니다 더 이상 이 자유롭게 데이터가 발생하지 않습니다.

메모리 누출 방지 / 감지 기술은 다음과 같습니다.

  1. 메모리 소비 측면에서 알고리즘을 고려하십시오. 다른 응답자들은 메모리를 유출하기 위해 할당 된 항목에 대한 포인터를 잃을 필요가 없다는 사실을 언급했습니다. 구현에 포인터 버그가없는 경우에도 실제로 필요 한 후에 할당 된 항목을 보유하면 메모리를 효과적으로 누출 할 수 있습니다.

  2. 응용 프로그램을 프로필하십시오. Valgrind 또는 Purify와 같은 메모리 디버거 도구를 사용하여 누출을 찾을 수 있습니다.

  3. 블랙 박스 테스트. 큰 데이터 세트를 공급 한 후 컴파일 된 코드에 어떤 일이 발생하는지 보거나 오랜 시간 동안 실행할 수 있습니다. 메모리 풋 프린트가 제한없이 성장하는 경향이 있는지 확인하십시오.

여기에 주어진 모든 정의 (내가 이것을 썼을 때, 우리는 더 나은 답변을 얻었을 때) 하나의 경계선 사례를 다루지 못합니다.

당신은 창조시 메모리를 할당하는 싱글 톤이 있으며,이 메모리는 현재 사용이 수행 되더라도 프로그램이 실행되는 한 일반적으로 유지되며 미래의 사용 여부는 알려지지 않았습니다. 이것은 일반적으로 그것을 재현하는 오버 헤드 때문에 수행됩니다.

"IT로 완료 될 때 자유롭게 실패"에 의해 표준 이것은 누출로 간주 될 것이며, 누출보고 도구가 메모리가 여전히 사용되고있는 것처럼 누출을 부르는 것을 보았습니다. (실제로 코드에는 객체를 청소할 수있는 코드가 포함되어 있지 않을 수 있습니다.)

그러나, 나는 객체를 재현하는 비용이 그다지 크지 않은 경우에도 컴파일러 라이브러리에서 이러한 특성의 코드를 만났습니다.

누출 여부?

편집 :이 답변은 잘못되었습니다. 나는 당신이 잘 알고 있다고 생각하는 것에 대해 오해가 얼마나 쉬운 지에 대한 예로 남겨두고 있습니다. 내 실수를 지적한 모든 분들께 감사드립니다.

메모리 누출은 : 프로그래밍 오류입니다. 소프트웨어는 시스템에서 일부 메모리를 빌려서 사용한 다음 완료되면 시스템으로 반환하지 못합니다. 이는 시스템이 재부팅 될 때까지 다른 프로그램에서 특정 메모리 덩어리를 사용할 수 없음을 의미합니다. 그러한 많은 누출이 사용 가능한 모든 메모리를 사용하여 완전히 쓸모없는 시스템을 만들 수 있습니다.

메모리 누출을 방지하려면 RIIA를 연습하고 항상 소프트웨어를 테스트하십시오. 이 작업에 사용할 수있는 많은 도구가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top