2011-10-26 4 views

답변

8

할당 된 메모리가 스레드 로컬이 아니기 때문에. 모든 스레드가 공유합니다.

변수는 다른 한편으로는 스레드 로컬이므로 할당 된 메모리가 확실히 손실됩니다 (다른 곳에서 해당 포인터의 복사본이없는 경우). 그리고 valgrind가 확실히보고하기 때문에 분명히 존재하지 않습니다 분실)

당신은 free해야합니다.

+0

음, 네, 로컬 스레드입니다. 그것이 바로 __thread의 요점입니다. – Blub

+2

아니요, 변수 만 ..이고 누가 이것을 downvoted ?? –

+2

그게 옳은 대답입니다. Downvoters는 어리석지 않습니다. –

2

free을 호출하여 명시 적으로 할당을 해제해야합니다.

malloc에 의해 할당 된 힙 할당 메모리는 free을 명시 적으로 해제 할 때까지 회수되지 않습니다. 스레드가 종료되면 할당 된 로컬 저장 객체 만 자동으로 할당이 해제됩니다.

일단 스레드가 종료되면 할당 된 메모리에 대한 포인터가 없기 때문에 이것은 분명히 손실됩니다. 메모리를 가리키는 포인터는 스레드의 스택에 국한되며 스레드가 종료되면 소멸됩니다. 할당 된 메모리는 힙 메모리이며 할당 해제되지 않습니다.

2

블록에 대한 유일한 포인터가 스레드 로컬이면 스레드를 종료하면 유일한 포인터가 손실됩니다.

즉, 더 이상 도달 할 수 없음 = 확실히 손실됩니다.

2

글쎄, 다른 말했듯이, 당신은 free해야합니다.

모든 스레드가 공통 힙을 공유하고 개념적으로 '소유권'메모리를 스레드간에 전달할 수 있습니다. 하나의 쓰레드는 malloc을 할 수 있고, 다른 쓰레드는 그것을 해제 할 수 있습니다. 그러나 힙은 메모리를 누가 소유하고 있는지 전혀 모르기 때문에 스레드가 종료 될 때 (힙이 어느 스레드를 malloc했는지 기억해도) 안전하게 삭제할 수 없습니다.

프로세스가으로 끝나면 모든 힙 메모리가 효과적으로 '해제'되지만 개별적으로는 수행되지 않습니다. 프로세스의 전체 힙 (아마도 하나의 큰 덩어리)이 운영 체제로 반환됩니다.

+0

메모리가 다른 스레드와 공유되지 않기 때문에 스레드 로컬 저장소의 경우 스레드가 안전하게 삭제할 수 있습니다. (적어도 논리적으로 공유되지는 않지만, 실수로 다른 스레드가 실수로 메모리에 액세스 할 수 있습니다. 예 : 배열 오버플로 방법) – Blub

+1

@Blub : 포인터 * 만 스레드 로컬입니다. 실제로 그것이 가리키는 것은 그렇지 않습니다. 'malloc'은 스레드 로컬 포인터에 리턴 값을 할당한다는 것을 알 수있는 방법이 없습니다. – Roddy

+0

@Blub : 일반적으로 다른 스레드가 메모리에 액세스 할 수 없다는 것을 결정하는 것은 중단 문제와 같습니다. 그래서 당신이 제안하는 것은 메모리가 때때로 해지 문제의 특별한 경우가 컴파일러에 의해 해결 될 수 있는지 여부에 따라 해제되거나 때로는 해제되지 않는다는 것입니다. 이제 double-free가 매우 위험한 정의되지 않은 동작을 유발하고 자동으로 해제되는지 여부를 알 수있는 방법이 없다는 것을 고려하면 재난에 대한 처방처럼 들립니다. –

0

"맛 좋음"/ "덜 채우기"인수와 조금 비슷합니다. Valgrind는 정확하고 데이터는 "여전히 도달 할 수 있습니다". 예를 들어 데이터에 암호가 포함되어 있으면 100 % 힙 스캔에서 추출 할 수 있습니다. 데이터가 고유 한 난수로 시작되면 다시 배치 할 수 있습니다. Valgrind는 더 이상 포인터를 통해 데이터에 액세스 할 수 없음을 의미합니다.

관련 문제