DLL 메모리 할당 및 공유
4245 단어 메모리 할당
알다시피 실행 가능한 파일의 전역 변수와 정적 변수는 같은 실행 가능한 파일의 여러 실행 사례에 공유될 수 없습니다.윈도 98은 실행 가능한 파일이 프로세스의 주소 공간에 비추었을 때 실행 가능한 파일의 전역 변수와 정적 변수에 해당하는 메모리를 분배하는 것을 확보할 수 있다.이 점을 확보하는 방법은 13장에서 소개한 쓰기 시 복사 (copy-on-write) 메커니즘을 사용하는 것이다.DLL의 글로벌 변수와 정적 변수는 동일하게 처리됩니다.프로세스가 DLL의 이미지 파일을 주소 공간에 매핑하면 글로벌 및 정적 데이터 변수의 인스턴스가 모두 생성됩니다.
주의해야 할 것은 하나의 주소 공간은 실행 가능한 모듈과 여러 개의 DLL 모듈로 구성되어 있다는 것이다.이 모듈들 중 일부는 정적 버전의 C/C++ 실행 라이브러리에 연결할 수 있고, 일부는 DLL 버전의 C/C++ 실행 라이브러리에 연결할 수 있으며, 일부는 (C/C++로 작성하지 않았다면
C/C++ 런타임 라이브러리가 필요하지 않습니다.많은 개발자들이 자주 자주 자주 발생하는 오류를 범한다. 왜냐하면 그들은 몇몇 C/C++ 실행 라이브러리가 하나의 주소 공간에 존재할 수 있다는 것을 잊었기 때문이다.다음 코드를 확인하십시오.
VOID EXEFunc(){ PVOID pv = DLLFunc(); free(pv);}
PVOID DLLFunc(){return(malloc(100)); }
그렇다면 당신은 이 문제를 어떻게 생각합니까?위의 이 코드는 정확하게 운행할 수 있습니까?DLL 함수에서 할당된 메모리 블록은 EXE 함수에서 방출됩니까?답은 가능하다.위에 표시된 코드는 당신에게 충분한 정보를 제공하지 않았습니다.만약 EXE와 DLL이 모두 DLL의 C/C++ 실행 라이브러리에 연결된다면 위의 코드는 잘 실행될 수 있습니다.단, 두 모듈 중 하나 또는 두 개가 정적 C/C++ 실행 라이브러리에 연결되면free 함수 호출에 실패합니다.프로그래머가 이런 코드를 작성하는 것을 자주 보았는데 결과는 모두 실패했다.
이 문제를 해결할 수 있는 아주 편리한 방법이 하나 있다.하나의 모듈이 메모리 블록을 분배하는 함수를 제공할 때, 이 모듈도 메모리를 방출하는 함수를 제공해야 한다.위의 코드를 다음과 같이 수정합니다.
VOID EXEFunc(){ PVOID pv = DLLFunc(); DLLFreeFunc(pv);}
PVOID DLLFunc(){ PVOID pv = malloc(100); return(pv);}
BOOL DLLFreeFunc(PVOID pv){ return(free(pv));}
이 코드는 정확하다. 시종 정확하게 운행할 수 있다.모듈을 작성할 때 다른 모듈의 함수가 C/C++를 사용하지 않았을 수도 있기 때문에malloc와free 함수를 사용하여 메모리를 분배할 수 없다는 것을 잊지 마십시오.코드에서 이러한 가설 조건을 사용하지 않도록 주의해야 한다.
또한malloc와free 함수를 내부에서 호출할 때 이 원칙은 C++의 new와 delete 조작부호에도 적용된다.
내 질문:
1. "두 모듈 중 하나 또는 두 개가 정적 C/C++ 실행 라이브러리에 연결되면free 함수에 대한 호출이 실패할 수 있습니다."왜요?정적 CRT library와 동적 CRT library의 차이점은 무엇입니까?
2. "DLL에서 함수의 코드로 만들어진 모든 대상은 호출 루트에 의해 소유되고 DLL 자체는 아무것도 가지지 않는다."DLL의 전역 변수는 어떻게 설명합니까?여러 애플리케이션에서 이 DLL을 사용하는 경우 DLL의 글로벌 변수에 동기화 메커니즘이 필요합니까?
1.malloc/free 때문에 new/delete는 모두 HeapAlloc/HeapFree를 호출하여 메모리 분배가 풀리는 것을 실현합니다.Windows API를 보면 두 함수 모두 매개변수로 Heap의 HANDLE이 필요합니다.CRT 라이브러리는 글로벌 변수를 사용하여 이 HANDLE을 저장합니다.정적 링크라면, CRT 라이브러리의 코드는 각 dll에 연결되며, 이 전역 변수도 포함됩니다.즉, 모든 정적 링크의 dll는 자신의 전역 핸들을 가지고 있으며, 그들은 모두 이 핸들에 메모리를 사용한다.한 dll가 다른 dll이 분배한 메모리를 방출할 때 사용하는 탭 손잡이가 일치하지 않아서 오류가 발생했습니다.동적 링크를 사용할 때, 모든 dll은 CRT 라이브러리의 dll 함수를 호출하여 메모리를 분배하고 방출하며, 같은 핸들을 사용하기 때문에 이 문제가 없습니다.
2. 서로 다른 프로세스 간에 dll 전역 변수에 대한 접근 운영체제는 구분할 수 있다. 평소에 모두가 한 부를 사용한다. 어떤 프로세스가 전역 변수를 바꾸면 운영체제는 자동으로 이 프로세스에 이 변수의 복사본을 생성하고 (copy-on-write) 이 프로세스가 복사된 내용에 접근하여 다른 프로세스에서 이 변수의 값에 영향을 주지 않기 때문에 수동으로 동기화할 필요가 없다.
인터넷에서 한 단락의 문자를 찾은 다음에adlay의 해석을 결합하면 기본적으로 명확해진다.
http://dev.csdn.net/author/houdy/9f4bb2dc376d437787032971ee0eff97.html
넷.malloc/free
이 두 함수는 사용 빈도가 가장 높은 두 함수로 표준 C 라이브러리의 일부이기 때문에 매우 높은 이식성을 가지고 있다.여기서'이식성'은 이들의 코드를 사용해 서로 다른 플랫폼에서 컴파일해 통과할 수 있고, 서로 다른 플랫폼 아래의 C Run-Time Library의 구체적인 구현은 플랫폼과 관련된 것으로, Windows 플랫폼의 C Run-Time Library에서 malloc()와free()는 Heap Memory API로 조정해 이뤄진다.주의해야 할 것은 CRun-Time Library는 독립된 Heap 대상을 가지고 있다는 것이다. 우리는 한 응용 프로그램이 초기화될 때 먼저 초기화된 것은 CRun-Time Library이고 그 다음은 응용 프로그램의 입구 함수이며 Heap 대상은 CRun-Time Library가 초기화될 때 만들어진 것이다.동적 링크의 C Run-Time Library의 경우 라이브러리는 한 번만 초기화되고 정적 연결의 라이브러리는 링크가 한 번씩 초기화되므로 정적 링크의 라이브러리마다 서로 다른 Heap 객체가 있습니다.이렇게 하면 어떤 상황에서 문제가 발생하여 프로그램 붕괴를 초래할 수 있다. 예를 들어 한 응용 프로그램이 여러 개의 DLL을 호출했는데 하나의 DLL을 제외한 다른 DLL은 응용 프로그램 자체의 동적 연결 라이브러리를 포함하여 그들은 같은 Heap 대상을 사용한다.정적 연결을 사용하는 DLL은 다른 DLL과 다른 Heap 대상을 가지고 있으며, 다른 DLL에 분배된 메모리가 이 DLL에서 방출될 때 문제가 발생한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java에서 메모리 할당의 몇 가지 방법1. 그룹 대상의 데이터 편이량 2.복사된 요소는 그룹 데이터의 편이량인 Arrays와 Java의 다른 대상과 마찬가지로 하나의 대상 헤더가 있는데 이것은 실제 데이터 앞에 저장된 것이다.이 머리의 길이는 unsaf...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.