2011-11-09 2 views
0

몬테카를로 시뮬레이션을 여러 번 실행 한 다음 개별 결과에 평균을 내야합니다. 매번 실행 한 후에 시뮬레이션에 필요한 물건에 할당 된 메모리를 확보하고 싶습니다. 이 자료의 한 조각은 sites의 배열이며, 각 site은 유형이 SLE 인 링크드 목록을 하나의 구성원으로 갖는 구조체입니다. 그래서 모든 것을 무료로 사용하려면 링크 된 목록을 반복하고 각 노드를 비운 다음 sites 배열의 메모리를 확보하십시오.완전히 다른 메모리를 해제 한 후 분할 오류가 발생했습니다.

그러나 매우 이상한 일이 있습니다. 시뮬레이션이 제대로 실행되면 다시 시작됩니다. sites에 필요한 메모리를 모두 다시 할당하고 언급 된 연결된 목록 SLEs을 다시 작성합니다. 그런 다음, 이전의 배열에 약간의 정렬 작업에, 그것은 segfault의 MIT 제공 : 나는 위의 코드에 free(neighbor)를 제거하면

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000408468 in sortNeighbors (list=0xad0e00) at mc_init.c:485 
485   while(temp && temp->next) 

을, 그것을 잘 작동합니다. 내가 말했듯이, 모든 것은 첫 번째 실행 전에처럼 재 할당됩니다. 그럼 여기서 어떻게됩니까? 정말로 해방 된 사실과 왜이 세분 사건이 일어나고 있는지에 대해 더 많은 정보를 수집 할 수 있습니까?


편집 : 다른 이상한 점은이 분류의 시작이 같다고한다 :

if (!list || !list->next) 
    return list; 

SLE * temp = list; 

// Find halfway through the list 
while(temp && temp->next) 
{ 

내가 명시 적으로 listlist->next가 존재하는지 확인, 왜 그것은에있는 세그먼트 폴트를주고있다 조건?


Edit2가 : 당신이 리눅스에있는 경우 할당

sites = (Site *) malloc(args.nsites_arg * sizeof (Site)); 
... 
// s is now one element of the sites array 
while(siteList) 
{ 
    neighbors  = (SLE*) malloc(sizeof (SLE)); 
    ... 
    neighbors->next = s->neighbors; 
    s->neighbors = neighbors; 
    siteList = siteList->next; 
} 
+0

그것에 대해 걱정'(무효 *) 'free (3)'에 대한 호출에서'캐스팅 된 '사이트들은'stdlib.h'헤더를 포함하는 것을 잊어 버렸기 때문에'free (3)'프로토 타입에 접근 할 수 없다는 것을 의미합니다. – sarnold

+0

'사이트 '를 어떻게 선언하고 할당하고 초기화 했습니까? – sarnold

+1

당신은'sites'를 다시 할당한다고 말하면서 사용하지 않은 모든 것들을 NULL로 설정합니까? 그렇지 않으면 모든 오래된 것들이 사라 졌는지/지워졌는지 확인해야합니다. 그래서 어디서나 포인터를 만지지 않을 것입니까? – nos

답변

1

는 내 대답 here를보십시오. 이 필요하지 않습니다 - 그것은 당신이 해제 된 메모리 (내가 이해로 사건을)에 접속하여 SIGSEV을 얻을 때

, 그것은 메모리가 해제 된 당신을 알려줍니다에 대한 Valgrind의, 디버깅 세그먼테이션 폴트 (segfault)를 도와주는 도구, 메모리 누수 등의 코드 조각에서 free 호출로 해제되었습니다. Windows 용

+0

나는 나중에 valigrind를 파헤 치려고 노력할 것이다. 링크 주셔서 감사합니다! – janoliver

0

좀 더 좋은 상용 툴 : 필요한 특별한 valgind --tool=memcheck [COMMAND]

그것은 상자 밖으로 작동, 아무것도 :

  • Purify는
  • 는 ++
+0

저는 리눅스에서 일하고 있지만 감사합니다. – janoliver

0

는 Valgrind의를 통해 실행 해보십시오 보험에 가입 .

자세한 내용은 Valgrind 웹 사이트를 참조하십시오.

1

버그를 검색하기 전에 잘 구현 된 single or double linked lists을 이미 사용하고 싶을 수 있습니다.

또는 당신의 MEM 버그와 gc garbage collector에 대한 링크를 귀찮게하지 않으려는 경우 (시뮬레이션의 실제 계산을 가정이하는 것이 무엇을해야하는지)

+0

링크를 제공해 주셔서 감사합니다. 나는 실제로 의존성을 가능한 한 간단하게 유지하기를 원합니다. 그리고 나는 여전히 C의 학습 과정에 있기 때문에, 문제를 찾아서 직접 해결하려고합니다. 또한 메모리 관리를 직접 해보면 더 조심할 수 있습니다. 연결된 목록에 대한 : 그들은 큰 구조체로 구성되어 있으므로 구현을 유지할 것입니다. – janoliver

관련 문제