2011-02-18 4 views
7

큰 응용 프로그램에 아주 이상한 문제가 있습니다. 나는 그들에 커스텀 객체를 저장하는 TObjectList를 많이 사용한다. 커다란 목록에서 나는 "CLEAR"방법을 사용할 때 "주소의 액세스 위반 .. 주소 읽기" "권한있는 명령"등으로 이상한 충돌을 경험했습니다. 목록에서 마지막 항목을 삭제하려고 시도 할 때이를 정확히 추적했습니다. 내가 포함 된 개체 삭제 그들의 proc 파괴에서 로깅하고 또한 자신에 대한 삭제하려고 시도 : (olist.count-1 downto 0 do .. debugmsg ('삭제'+ inttostr (a)) .. olist.delete (a)), 목록에서 마지막으로 남은 항목을 삭제할 때 두 가지 방법으로 액세스 위반이 발생합니다.TObjectList.Clear access violation

이것은 항상 발생합니다. 다른 영역에서도 명확하게 사용하고 일부 다른 (더 작은) 목록을 사용하기 때문에 발생합니다.하지만 앱의 특정 시점에 이런 일이 발생합니다.

나는 무엇이 잘못 될지 전혀 모른다. 명확하지 않은 동안 목록에 액세스하려고 시도하는 것이 아무것도 없다. cointained 개체는 부모 개체 목록에 액세스 할 수 없다. TObjectList.delete에 뭔가가있다./마지막 항목 지우기에 관해서는 명확한 방법.

제안 사항? Delphi XE 사용.

+1

다른 곳에서 발생하는 메모리 손상과 모양이 비슷합니다. –

+2

TObjectList에는 'OwnsObjects' 속성이 있습니다. 그것은 진실인가 거짓인가? TObjectList를 사용하는 코드는 실제로 어떤 모양입니까? –

+0

@Remy : "스스로 삭제하려고 시도하는 중"이라는 비트에서 "OwnsObjects"가 "true"로 설정되어 있다는 것은 명백합니다. –

답변

18

이미 해제 된 개체를 해제하는 것처럼 들리 네요. 이 문제를 추적하려면 download the full version of FastMM을 추가하고 링크 아래의 프로젝트 옵션 -> 델파이 컴파일러 및 맵 파일 옵션의 조건부 정의 행에 FullDebugMode을 추가하고 상세로 작성한 다음 다시 작성하십시오. (Build, not Compile.) 그런 다음 FullDebugMode DLL을 EXE와 같은 폴더에 복사하고 실행하십시오. 당신이 할당하고 무료로 당신의 기억을 지켜 볼 것입니다 그리고 당신이 두 번째 시간에 같은 개체를 해방하려고 할 때, 그것은 그것을 잡을 것이고 당신에게 문제가 어디에서 왔는지에 관해서 매우 상세한 디버그 데이터를 줄 것입니다.

+4

+1이 문제의 가장 큰 원인이며 수정 프로그램을 시도하는 가장 좋은 방법입니다. 다른 가능한 원인이 있지만 먼저 시도하십시오. –

+0

"FastMM은 해제 된 개체에 가상 메이트를 호출하려고 시도했습니다. 현재 작업을 중단하기 위해 액세스 위반이 발생합니다." 이 모든 것을 분석하는 데 조금 시간이 걸리지 만 큰 도움이됩니다. 곧 다시 돌아올거야. 고마워요 :) – hikari

+0

@Hikari : 네, 그 중 하나입니다. FullDebugMode *를 해제하는 릴리스 빌드를 할 때 반드시 확인하십시오. * –

1

마지막 개체가 유효하고 아직 삭제되지 않았습니까? 예를 들어 목록에 두 번있을 수 있습니다. 다른 버그로 인해.