2009-08-18 4 views
1

내 할당 된 새 연산자를 사용하지 않고 내 메모리 디버깅 유틸리티 내에서 STL 컨테이너에서 사용할 사용자 지정 할당자를 구현했습니다. 메모리 디버거에서 동일한 할당 자 클래스의 인스턴스를 사용하여 '정상'메모리 할당을 추적하는 데 필요한 객체를 할당합니다. 그것은 모두 잘 작동하지만 allocator 인터페이스를 사용하는 방식이 올바른지 확실하지 않습니다. 여기 (항목이 곧 추가 될 예정에 대한 올바른 초기화 매개 변수)가 현재 서 같은 유틸리티 방법이 있습니다 : 이것은 단지 매우 지저분한 것할당자를 사용하여 객체를 인스턴스화하는 올바른 방법은 무엇입니까?

iidebug::CMemoryDebugger::CEntry* iidebug::CMemoryDebugger::NewEntry() 
{ 
    CEntry* pEntry = m_entryAllocator.allocate(1); 
    if (0 != pEntry) 
    { 
     new(pEntry) CEntry(0, 0, __FILE__, 0, 0, 0); 
    } 
    return pEntry; 
} 

void iidebug::CMemoryDebugger::DeleteEntry(iidebug::CMemoryDebugger::CEntry* pEntry) 
{ 
    if (0 != pEntry) 
    { 
     destruct(pEntry); 
     m_entryAllocator.deallocate(pEntry, 1); 
    } 
} 

은,하지만 난 그것을 개선 할 수있는 방법을 볼 수 없습니다.

답변

1

당신은 실제로 새로운 과부하과 같이, 할당 자 매개 변수를 사용하기 위해 삭제할 수 있습니다

inline void *operator new(size_t sizeT, Allocator *&a) { 
    return a->allocate(sizeT); 
} 

inline void operator delete(void * mem, Allocator *&a) { 
    a->release(mem); 
} 

int main() 
{ 
    Allocator * a = new Allocator; 
    C *c = new(a) C; 
    c->~C(); 
    operator delete(c, a); 
    return 0; 
} 

더 자세히 위해 wikipedia article를 참조하십시오. 할당 자 (allocator)가 특별한 것을하면 정규 삭제 연산자를 호출하지 말아야하기 때문에 좀 지저분하다.

+0

그게 훨씬 깔끔한 옵션, 덕분에 스택 :) – FlintZA

+1

내가 좋아하는 일은 또한 모든 할당 할당의 머리 부분에 함수 포인터가 있어야합니다 (32 비트 x86 응용 프로그램에서 작업하는 경우 여분의 4 바이트를 추가해야 함).이 함수는 dealloc 함수를 가리 킵니다. 기억을 먹었다. 그런 다음 객체를 삭제하면 (기본 객체 인 delete 연산자를 통해 모든 객체를 삭제할 수 있음) 해당 함수 포인터를 호출하기 만하면됩니다. –

+0

흥미로운 아이디어는 메모리 디버깅을위한 것입니까? 기본 new에 있고 동일한 함수 포인터가 항상 전달되는 경우 각 포인터에서 여분의 4 바이트를 사용하는 대신 재정의 된 delete에서 명시 적으로 함수를 명시 적으로 호출하지 않는 이유는 무엇입니까? – FlintZA

0

destruct은 무엇입니까? 나는 그것이해야한다고 가정

void iidebug::CMemoryDebugger::DeleteEntry(iidebug::CMemoryDebugger::CEntry* pEntry) 
{ 
    if (0 != pEntry) 
    { 
     pEntry->~CEntry(); 
     m_entryAllocator.deallocate(pEntry, 1); 
    } 
} 
+0

죄송합니다, 파괴는 HTTP와 같이 파괴를 처리하기 위해 구현 된 세 가지 도우미 기능 중 하나입니다 : //www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079 – FlintZA

1

Drew의 코드를 사용하는 데 어려움을 겪고있는 사람을 위해 참고할만한 몇 가지 조정이 필요합니다. 다음은 내가 사용 결국 무엇을 :

template <typename T> 
void* operator new(SizeT iSize, SimpleAllocator<T>& rAllocator) 
{ 
    return rAllocator.allocate(1); 
} 

template <typename T> 
void operator delete(void* pvMemory, SimpleAllocator<T>& rAllocator) 
{ 
    ((T*)pvMemory)->~T(); 
    rAllocator.deallocate(pvMemory, 1); 
} 

을 그리고 사실대로 간단 사용 :

그것에 대해
// SimpleAllocator<CFoo> fooAllocator = ... 
CFoo* pFoo = new(fooAllocator) CFoo(param1, param2, ...); 
// Do stuff with pFoo... 
operator delete(pFoo, fooAllocator); 
관련 문제