2009-08-29 6 views
84
new/delete

동적 할당은
malloc/free 동안 작업이 를 사용 무료 매장에서 발생하는 것으로 알려져 있습니다.

실제 차이점이 있는지 알고 싶습니다.
컴파일러는 두 용어를 구분합니까? (무료 저장하지 new/malloc)C++는 자유 스토어 힙

답변

62

http://www.gotw.ca/gotw/009.htm 참조;

무료 매장 :

할당 된 무료 저장소가 두 동적 메모리 분야 중 하나입니다 /이 힙과 내가 할 수있는 것보다 훨씬 더 자유 매장의 차이점을 설명 할 수 신규/삭제로 을 해제했습니다. 개체 수명은 일 수 있으며 저장 시간은 입니다. 즉, 무료 저장소 개체 은 이 즉시 초기화되지 않고 할당 된 메모리를 가질 수 있으며 이 즉시 할당 취소되지 않고 을 삭제할 수 있습니다. 기간 동안 저장 을 할당하지만, 오브젝트의 수명 밖에 상기 저장소에 액세스 할 수 있고 이 공극 * 통해 조작하지만 프로토 개체의 비 정적 멤버 또는 멤버 함수 것도 액세스 없을 수도있는 그들의 주소는 이거나 다른 방법으로 조작해야합니다.

힙 :

힙은 다른 동적 메모리 영역 할당 /의 malloc/무료 과 그 변종에 의해 해제. 주 동안 그 기본 전역 새로운 힙 안전하게 에서 해제 할 수없는 일 개 지역에 할당 된 무료 저장 및 메모리와 동일하지 않습니다 가 특정 컴파일러에 의해 무료 의 malloc의 관점에서 구현 될 수 삭제 다른 하나. 힙에서 할당 된 메모리는 배치 새로 만들기 및 명시 적 제거로 클래스 유형의 객체에 사용할 수 있습니다. 그렇게 사용 된 경우 무료 저장 개체 수명에 대한 메모 이 여기에 유사하게 적용됩니다.

+19

동적 할당의 문맥에서 "힙"이라는 단어는 C++ 표준이나 C99에서 사용되지 않습니다 (C89가 없습니다. C++은 단어를 사용하면 나를 바로 잡을 수 있습니다.) 문제의 GotW가 게시 된 날짜를 찾을 수 없지만 초안에 대해 이야기 했으므로 분명히 사전 표준입니다. – avakar

+1

이것은 모두의 질문입니다. 용어, imho. Stroustrup은 '힙'과 '무료 스토어'를 구별하지 않습니다. http://www.stroustrup.com/Programming/17_free_store.ppt, slide 12 '힙'은 메모리 할당을 위해 힙 (heap) 데이터 구조를 사용했던 Lisp 시간 (1960 년대) 이래로 C++ 이전의 동적 메모리의 동의어. –

1

나는 표준 적 push_heap 등 같은 힙 함수의 설명을 제외하고, 단어 힙을 언급 기억하지 않습니다. 모든 동적 할당은 무료 저장소에서 수행됩니다.

+0

예 - 죄송 합니다만 아직 아침 식사를 먹지 않았습니다 :-( –

2

"힙"이라는 용어는 특정 데이터 구조를 참조 할 수도 있지만 C++ malloc, free, new 및 delete 연산과 관련하여 "heap"및 "free store"라는 용어는 다소간 호환 가능하게 사용됩니다 .

14

마이크 코발 (Mike Koval)의 대답은 이론을 아주 잘 설명합니다.그러나 실제로는 거의 같은 영역의 메모리입니다. 대부분 컴파일러의 구현 인 new을 파헤 치면 malloc()이 호출됩니다.

즉, 컴퓨터의 관점에서 힙과 무료 저장소는 동일한 것입니다. 구별은 컴파일러 내부에 존재합니다.

C++의 출현 전에 우리는 "힙 (heap)"이라고 불리는 것을 이제는 "무료 저장소"라고 부릅니다.

41

C++의 경우, 무료 저장소와 힙의 차이점은 완전히 개념적으로 바뀌 었습니다. 버그를 수집하는 항아리와 쿠키를 수집하는 항아리. 하나는 한 방향으로, 다른 하나는 다른 방향으로 표시되어 있습니다. 이 지정은 "새로운"및 "삭제"를 "malloc", "realloc"또는 "무료"(또는 해당 비트 수준 세트)로 절대로 혼용하지 않는다는 것을 의미합니다.

인터뷰하는 동안 "무료이고 malloc을 무료로 사용하고 힙을 무료로 사용하고 new와 delete는 각각 생성자와 소멸자를 호출하지만 malloc과 free는 사용하지 않는 것이 좋습니다." 그러나 메모리 세그먼트가 실제로 같은 영역에 있음을 자주 듣게 될 것입니다. 그러나 컴파일러에 따라 컴파일러가 달라질 수 있습니다. 즉, 서로 다른 메모리 공간을 풀로 지정할 수도 있습니다 (왜 그렇게 될지, 그래도).

2

힙과 무료 저장소는 상호 운용 될 수 없습니다. C++ 11 표준 라이브러리가있는 AVR 8 비트 마이크로 컨트롤러와 같은 비경제적인 상황에서는 동일한 프로그램에서도 사용할 수 없습니다. 프리 스토어와 힙은 동일한 메모리 공간에서 할당을 수행하여 서로 구조와 데이터를 덮어 씁니다. "Free/store free 라이브러리"가 "Malloc/free/realloc/calloc 힙 라이브러리"보다 간단하고 (더 빠르기 때문에) Free Store는 Heap과 다르며 호환되지 않으므로 많은 메모리 사용량을 얻을 수 있습니다. C++ 임베디드 프로그래머 (512 바이트의 RAM 만있는 컨텍스트에서)

는 참조 14분의 11 표준 라이브러리가 https://github.com/ambroise-leclerc/ETL/tree/master/libstd

0

무료 스토어를 실행하는 동안 동적 할당을위한 프로그램에 의해 사용되는 프로그램에 주어진 할당되지 않은 힙 메모리의 풀이다 C++ 8 비트 프로그램. 모든 프로그램에는 실행 중에 활용할 수있는 할당되지 않은 힙 메모리 풀이 제공됩니다. 이 사용 가능한 메모리 풀은 프로그램의 무료 저장소라고합니다. 할당 된 무료 저장소 메모리의 이름이 지정되지 않았습니다.