몬테카를로 시뮬레이션을 여러 번 실행 한 다음 개별 결과에 평균을 내야합니다. 매번 실행 한 후에 시뮬레이션에 필요한 물건에 할당 된 메모리를 확보하고 싶습니다. 이 자료의 한 조각은 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)
{
내가 명시 적으로 list
및 list->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;
}
그것에 대해 걱정'(무효 *) 'free (3)'에 대한 호출에서'캐스팅 된 '사이트들은'stdlib.h'헤더를 포함하는 것을 잊어 버렸기 때문에'free (3)'프로토 타입에 접근 할 수 없다는 것을 의미합니다. – sarnold
'사이트 '를 어떻게 선언하고 할당하고 초기화 했습니까? – sarnold
당신은'sites'를 다시 할당한다고 말하면서 사용하지 않은 모든 것들을 NULL로 설정합니까? 그렇지 않으면 모든 오래된 것들이 사라 졌는지/지워졌는지 확인해야합니다. 그래서 어디서나 포인터를 만지지 않을 것입니까? – nos