메모리 누수 및 분할 오류가 발생하는 일반적인 이유는 무엇입니까?
-
05-07-2019 - |
문제
메모리 누수 및 분할 오류 종류의 오류가 발생하는 일반적인 이유는 무엇입니까?
해결책
segfaults :
- 매달려 포인터 사용 : 거래 후 포인터를 재설정하지 않음
- 사용하기 전에 포인터를 확인하지 마십시오
- 변수/멤버를 초기화하지 않습니다
메모리/자원 누출 :
- 리소스를 릴리스하는 것을 잊어
- 쓰레기 수집가가있는 환경에서 : 참조 개체의 고리 만들기
감지/피하는 방법 :
- 매달려 포인터 : 코딩 규칙, 거래 후 포인터를 엄격하게 재설정
- 대부분의 segfaults를 피하려면 정적 코드 검사기를 사용하십시오
- 동적 코드 분석기를 사용하여 리소스 누출이 멀리 있는지 확인하십시오.
다른 팁
메모리 누출: 일반적으로 이것은 메모리를 수동으로 관리하는 C와 같은 언어를 나타냅니다. 이 경우 메모리를 사용하면 메모리를 확보하지 않고 메모리를 할당 할 것입니다. 애플리케이션이 실행되는 동안 할당은 계속 쌓이고 프로세스가 실행 될 때까지 메모리를 해제 할 수 없습니다. 메모리 누출 (Wikipedia)
분할 결함: 이러한 유형의 오류의 가장 일반적인 이유는 존재하지 않거나 실행중인 실행 프로그램의 메모리가없는 메모리의 일부에 액세스하려고하기 때문입니다 (예 : OS가로드 된 메모리에 액세스하려고 시도한 경우 ). 일반적으로 이것은 예를 들어 나쁜 포인터를 사용하려고한다는 것을 의미합니다.
int* ptr;
...
...
...
*ptr = 5;
PTR은 널 포인터 (또는 쓰레기)이며 포인터가 가리키기 위해 메모리를 할당하지 않았기 때문에 segfault를 유발합니다. 세분화 결함 (Wikipedia)
많은 것 : :
- 메모리 덩어리를 할당 한 다음 더 많이 사용하여 할당되었습니다.
- 메모리를 할당하고 자유롭게하지 않음
- 데이터 포인터를 올바르게 초기화하지 않음
- Funciton 포인터를 올바르게 초기화하지 않음
- 숫자가 잘못된 숫자 또는 매개 변수 값으로 함수를 호출합니다.
- 널 포인터를 통해 읽거나 쓰려고 시도,
- 라이브러리 또는 잘못된 라이브러리에 잘못 연결됩니다.
이 모든 것이 모든 언어에 적용되는 것은 아니지만 생각하기 시작하는 유용한 것들입니다.
당면한 문제에 대해 매우 유용한 Addison Wesley의 Effective C++ 시리즈를 참조하세요.포인터를 사용하려면 모든 요소를 개별적으로 삭제한 다음 포인터를 삭제해야 합니다. 기술이 필요하며 종종 잘못되어 쉽게 표시되지 않는 숨겨진 오류가 발생합니다.다른 포스터에 답변이 있습니다. 추가 세부 사항만 추가하고 있습니다.