2013-03-10 3 views
3

최근에 포인터 (또는 적어도 배열)가 메모리가 생성 된 다른 어셈블리에서 삭제 될 수 없다는 것을 발견했습니다 (here). 내가 아는 바로는 포인터는 메모리에있는 다른 변수의 주소 값을 갖는 메모리의 변수입니다. 따라서 포인터의 값 (변수의 주소)을 지우고 다른 어셈블리에서 메모리를 해제 할 수없는 이유는 무엇입니까?어셈블리에서 포인터를 삭제할 수없는 이유는 무엇입니까?

+0

어셈블리를 무엇이라고 부릅니까? 아마도 번역 단위와 같을까요? –

+3

여기서 '어셈블리'를 사용하지만 라이브러리 또는 DLL을 의미 할 가능성이 있다고 생각합니다. 어쨌든,'new'와'delete'의 기본 구현은 DLL/라이브러리에 의해 사용되는 런타임 사이에 달라질 수 있습니다. 이는 혼합 및 매칭시 손상을 일으킬 수 있습니다. – Joe

+0

나의 무지를 용서해. 닷넷에서 C++로 왔고 어셈블리와 라이브러리를 동의어로 사용했다. (실제로 나는 그 차이를 잘 모른다.) @ 조,'new'와'delete'의 구현이 다르게하지 않습니까? 문제가있는 곳을 예로들 수 있습니까? – JMCF125

답변

3

모든 동적 할당은 할당 된 것과 동일한 힙으로 돌아갈 필요가 있습니다. 각 DLL (그리고 나는 assembly이 DLL에 해당합니다.)은 자체 힙을 가질 수 있으므로 할당 된 것과 동일한 DLL 또는 이상한 것 (예 : 오류 또는 충돌)에서 해제해야합니다.) 일어날 것이다.

다른 두 모듈 (DLL, asemblies)이 같은 힙을 가지고 있다는 것을 알지 못하면 다른 모듈에 할당 된 한 모듈에서 무언가를 해제 할 수 없습니다.

무언가를 힙으로 되 돌리는 요구 사항은 라이브러리 책을 "잘못된"라이브러리로 반환하는 것과 비슷합니다. 라이브러리 원이 라이브러리에서 책을 찾을 수 없을 때 모든 혼란을 야기합니다 "새로운"도서관은 그 책에 대해서 전혀 알지 못한다. 우리가 라이브러리에 갈 때 우리 모두가 이것을했다고 상상해보십시오 ... 힙은 힙의 객체를 "추적"하는 내부 데이터 구조를 포함합니다. 우리가 갑자기 그들이 속하지 않는 곳으로 되돌리기 시작하면, 이상한 일들이 일어날 것입니다.

+1

"각 DLL에는 자체 힙이 있습니다"는 사실 일 필요는 없습니다. 공유 힙을 사용하도록 DLL을 컴파일 할 수 있습니다. 개별 힙을 사용하도록 파일을 컴파일 할 수도 있습니다. – Yakk

+0

감사합니다. 명확히하기 위해 개정되었습니다. –

+0

이 혼란은 내가 윈도우즈에서 프로그램 할 필요가 없다는 것에 감사함을 표한다. – vonbrand

관련 문제