2014-11-10 3 views
2

현재 C++ 표준 데이터 구조에서 사용할 수 있어야하는 할당자를 작성하고 있습니다. 즉, Allocator 개념을 구현합니다.C++ 할당자가 소멸/복사/이동 될 때 할당 된 메모리를 어떻게 처리해야합니까?

할당자는 아주 간단합니다 : x 개체의 청크를 할당하고 현재 청크가 가득 차 있지 않은 경우 항상 다음 개체를 나눠줍니다. 그렇지 않으면 새 청크가 할당됩니다.

지금 내 질문은 : 할당자가 파괴/복사/이동했을 때 이러한 청크를 처리하는 방법은 무엇입니까? 할당 자 개념은 이러한 경우에 일어날 일에 대해 아무 것도 말하지 않는다.

  • 파괴가 : 할당자가 모든 덩어리를 파괴 할 수있다 여기에

    내 생각이다. 그러나 할당 된 객체를 사용하는 객체가 할당 자보다 오래 남아있을 수는 없습니다.
  • 복사 : 가장 간단한 아이디어는 청크를 복사하는 것입니다. 그러나 두 번째 생각에서 이것은 의미가 없습니다. 아무도 복사 된 덩어리의 개체 주소를 알지 못하므로 아무런 이점도없이 복사됩니다. 복사 된 할당자는 어쩌면 빈 청크 목록으로 시작해야합니다.
  • 이동 : 청크를 새 할당 자로 이동해야합니다. 이전 버전에는 빈 청크 목록이 있어야합니다.

내 가정이 정확합니까? 그렇지 않다면, 왜 그리고 어디서 정의되어 있습니까?

답변

3

일반적으로 할당자는 경량 객체이며 주위에 복사하여 파괴 할 수 있습니다. 표준 컨테이너 클래스에서. 따라서 그들은 무거운 메모리 관리를 직접해서는 안되며 좀 더 영구적 인 메모리 관리자 객체로 전달해야합니다. 그렇게하면 메모리 청크의 수명은 할당 자의 수명이 아니라 메모리 관리자 객체의 수명에 달려 있습니다.

할당 자 (수명이 짧은) :

  • 복사/이동 : 평생 생각 따라서 물체의 두 유형에 적용 할 수있는 메모리 관리자에 대한 참조를 복사한다.
  • 파괴 : 아무 것도하지 않습니다 (메모리 관리자의 외부 수명 관리). 또는 메모리 관리자를 파괴 할 수 있습니다. 각각의 할당은 메모리 관리자

메모리 관리자 (긴 수명)에있는 shared_ptr이 있습니다

  • 복사가 금지되어야한다 , 그것은 관리자와 관리되는 스토리지를 복제하는 이해되지 않는다
  • 이동은 허용 될 수 있지만별로 의미가 없습니다. 메모리 관리자는 싱글 톤과 같은 클래스, 즉 이동 될 필요가없는 하나의 고정 된 인스턴스 일 수있다.
  • 다른 개체가 관리되는 저장소 할당을 해제하는 방법을 알지 못하기 때문에 파기는 관리되는 메모리를 파괴해야합니다.