문제

친애하는 G ++ 해커, 다음 질문이 있습니다.

결함이있는 프로그램에 의해 객체의 일부 데이터를 덮어 쓰면 왜 프로그램이 이중 자유 오류로 해당 객체의 파괴에 실패합니까? 데이터가 손상되었는지 아닌지 어떻게 알 수 있습니까? 그리고 왜 두 배의 자유를 유발합니까?

도움이 되었습니까?

해결책

일반적으로 객체의 메모리가 덮어 쓰는 것이 아니라 객체 외부의 메모리의 일부입니다. 이것이 Malloc의 컨트롤 구조에 부딪히면, Free는 일단 접근하면 Free Freak가 발생하여 손상된 구조를 기반으로 이상한 일을하려고합니다.

바보 같은 물건으로 객체 메모리를 덮어 쓰는 경우 Malloc/Free가 알 수있는 방법은 없습니다. 귀하의 프로그램은 충돌 할 수 있지만 다른 이유로.

보세요 Valgrind. CPU를 에뮬레이션하고 Malloc의 제어 구조를 덮어 쓰려고 시도하는 것과 같은 모든 메모리 액세스를 시청하는 도구입니다. 사용하기가 정말 쉽습니다. 대부분의 경우 Valgrind 내에서 프로그램을 시작하여 선점을 시작합니다. valgrind 껍질에, 그것은 당신에게 많은 고통을 절약합니다.

C ++에 관하여 : 언제나 Delete []와 함께 삭제 및 새로운 []와 함께 새로 새로운 것을 사용해야합니다. 절대로 섞지 마십시오. 종종 당신이 묘사하는 것과 비슷한 나쁜 일이 일어날 것입니다 (그러나 Valgrind는 당신에게 경고 할 것입니다).

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