2014-12-09 2 views
5

정상적인 상황에서 메모리 할당 해제를 처리하는 방법을 알고 있습니다. 내 경우는 조금 다르다.연산자 삭제 - 구현하는 방법?

나는 내 자신의 메모리 풀을 구현하고있다. 나는 클래스의 클라이언트가 할당 및 할당 해제의 일반적인 방법에 가깝게되기를 원할 것이다.

inline void* operator new(size_t dead_param, CPool& objPool) 
{ 
    return objPool.Allocate(); 
} 

내 클래스의 사용자가 단순히

Base baseObj = new (poolObj)Base2();

를 호출 할 수 있도록 내가이 글로벌 기능이

지금은 소멸자를 호출하는 방법을 몰라? 나는 글로벌 운영자가

inline void operator delete(void* ptr, CPool& objPool) 
{ 
    objPool.DeAllocate(ptr); 
} 

가이드하시기 바랍니다 삭제해야하지만 내가 클라이언트 코드에서 호출이 기능을 얻을 수있는 방법 나는 .. 아무 생각

이 없습니다 clearl? 사용자 측에서 최소한의 구문 변경. 또한 내 코드 사용자가 operator newoperator delete을 구현하고 거기에서 AllocateDeAllocate을 호출하는 것을 원하지 않습니다.

+0

왜 사람들은'자료 * baseObj = poolObj.Allocate()를 호출 단지가, 클라이언트에 대한' – Barry

+0

구문 조금 못 생겼어. 'Base * baseObj = (Base *) poolObj.Allocate()'. Yuck .. 타입 캐스팅 ... 최종 리조트로 유지 했음에도 불구하고 ..이 함수를 호출 할 수 없기 때문에 저는 지금 큐러입니다. – Adorn

+5

생성자가 종료 될 때만 배치 내부에서 새로운 배치가 삭제됩니다 예외. 다른 모든 경우에는 "정상적인"연산자 delete (void *)가 호출됩니다. 추가 입력없이 할당 된 메모리 블록에 충분한 정보를 저장하여 나중에 할당을 취소 할 수 있습니다. 종종 할당자는 반환하는 포인터의 음수 오프셋에 추가 정보를 씁니다. –

답변

1

그것의 짧은 : 새로운 위치로 명시 적으로 호출 소멸자 확인하는 유일한 경우입니다 :

baseObj-> ~ 자료();

그러나 메모리 풀을 사용하면 최종 사용자가 모든 책을 유지하게되므로 실제로 메모리 풀을 사용하는 것보다 메모리 풀 클래스가 더 좋지 않습니다 (그리고 논란의 여지가 있지만 약간 악화 될 수 있습니다). std :: vector. 나는 사용자가없는 것

가 배치 자신의 메모리 풀을 공급하는 경우 자신이 ... 아니라, 그것이 ObjectPool 클래스 withing에 수행해야합니다 새로운 수행 솔직히

class ObjectPool { 
    public: 
    template <typename T, typename... A>/*c++ 11 ftw*/ 
    T* allocate(A... args) { 
     void* create_location;//pool figures out where this is, probably with sizeof<T> 

     return new (create_location) T(args...); 
    } 
    template <typename T> 
    void dellocate(T* t) { 
     t.~T();//With placement new, this is the one place this is OK 
     //pool marks that memory as avaiable to be allocated in 
    } 
} 

을,이 유일한 방법입니다 당신의 수영장이 더 많은 유틸리티를 가지고 있다면 최종 사용자는 단지 자신의 std::vector<uint8_t>을 만들어야합니다.

이 힙에 다른 작업을 할당에서 T를 유지하기 위해 아무것도하지 않는 것을 주목해야한다 ...

+0

좋아 .. 아마도 당신이 디자인에 대한 질문을 좀 더 많이들을 수 있습니다. http://stackoverflow.com/questions/27375620/generic-memory-pool-how-to-design-issue 나는 당신이 말하고자하는 것을 완전히 얻지 못하고 있습니다. – Adorn

관련 문제