2011-01-19 6 views
4

공유 라이브러리 (또는 DLL)가 dlopen 및 dlclose 메커니즘을 통해 사용되고 있고 작성된 공유 라이브러리에 힙에서 온 메모리가있는 전역 변수가있는 경우 dlclose가 호출 될 때 해당 변수와 메모리에 어떤 일이 발생하게됩니까? ?dlclose가 호출 될 때 공유 라이브러리의 전역 변수는 어떻게됩니까?

동일한 프로세스에서 dlopen이 다시 호출되면 동작은 어떻게됩니까?

+0

전역 변수는 일반적으로 힙에 있지 않습니다. 귀하의 질문에 잘못된 가정이 사용 된 것 같습니다. –

+0

@Employed 러시아어, 힙에서 메모리를 할당 할 전역 포인터 변수가 있습니다. 그게 어떻게 될까요? 또한 정상적인 정적 전역 변수가 있으면 그 변수는 어떻게됩니까? – Jay

답변

8

dlclose이 참조 횟수를 줄이고 라이브러리가 실제로 언로드되면 라이브러리를 다시로드하면 라이브러리의 정적 저장 기간이있는 모든 변수가 원래 값으로 재설정됩니다.

그러나 라이브러리가 두 번 이상 열리면 dlclose에 대한 최종 호출을 제외한 모든 참조 수가 감소합니다. 때로는 라이브러리가 두 번 이상 열렸는지 여부가 명확하지 않을 수 있습니다. 프로그램에 로컬 인 모듈이 아니라면 모르는 사이에 다른 라이브러리의 종속성으로로드되었을 수 있기 때문입니다. 따라서 의존하지 않는 것이 좋습니다. 이 "재설정"동작.

취업자 러시아어 추가 : 라이브러리가 dlopen() 에드와 dlclose() 정확히 번 D, 또한 증가합니다 뭔가 다른, (dlsym()을 통해) 그것에서 참조하는 심볼의 행위에 의존하지

하더라도 참조 카운트 (및 라이브러리를 언로드 할 수 없도록 함); 적어도 리눅스에서는.

이 정보가 정확한지 여부는 알 수 없습니다. 앞으로는 다른 사람들의 답변을 수정하지 말고 새로운 정보를 의견이나 새로운 답변으로 게시하십시오. 다른 사람의 답을 편집하는 경우, 답을 정확하게 작성해야 할 책임이 있습니다. 원하지 않을 수도 있습니다.

+0

@R, 답변 해 주셔서 감사합니다. 정적 저장소가있는 모든 전역 변수가 자동으로 재설정된다는 의미입니까? malloc을 통해 메모리가 할당 된 전역 포인터는 어떻습니까? – Jay

+0

메모리 누수 여부를 묻는다면 대답은 '예'입니다. 포인터가 없어집니다. ** 그렇게하지 마십시오. ** 라이브러리가 전역 상태를 유지해야하는 경우 동적 할당이 아닌 하나 이상의 정적 저장 기간의 객체 (가능한 큰 객체)를 사용하십시오. 데이터가 런타임에 생성 된 상수의 테이블 일 경우, 대신 컴파일 타임에 생성 할 스크립트를 작성하여 정적 정적 배열로 만드십시오. 디스크 공간을 희생시켜 (값싼) 많은 메모리를 절약 할 수 있습니다. –

+1

추한 해결 방법이 있습니다 : 라이브러리 dlopen 자체를 가지고 포인터가 반환 된 포인터를 버리면 참조 카운트가 한 번로드 된 후 참조 카운트가 0이되지 않습니다. 하지만이 일을하는 것이 좋습니다 ... –

관련 문제