2010-02-24 2 views
8

배열에 section 11.14 of the C++-FAQ-lite을 적용하는 방법을 알고 싶습니다.오버로드 된 풀 연산자 delete를 선언하고 사용하는 방법은 무엇입니까?

class Pool { 
public: 
    void* allocate(size_t size) {...} 
    void deallocate(void* p, size_t size) {...} 
}; 

void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); } 
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); } 

struct Foo {...}; 

int main() { 
    Pool pool; 

    Foo* manyFoos = new (pool) Foo [15]; 

    /* ... */ 

    delete [] (pool) manyFoos; 
} 

그러나, 나는 선언하고이 operator delete[] (pool)를 호출 할 올바른 구문을 알아낼 수 없었다 :

기본적으로, 나는 이런 식으로 뭔가를 원하는 것입니다. 아무도 여기서 도울 수 있니?

답변

1

불가능합니다. Bjarne는 올바른 풀을 알아 내지 못하게하는 이유가 있습니다. 그의 해결책은 다음과 같습니다. 수동으로 모든 소멸자를 호출 한 다음 올바른 풀을 찾아 메모리를 수동으로 할당 해제 할 수 있어야합니다.

참고 :

비얀의 FAQ : Is there a placement delete?

관련 C++ 표준 섹션 :

3.7.3.2.2 만 회원 연산자를 size_t 타입의 인수를 삭제 기능은 삭제 표현식으로 간주됩니다.

5.3.5.1 표현식 구문을 삭제해도 추가 매개 변수가 허용되지 않습니다.

2

전화 먼저하고 개별 개체에 DTORS 사용 :

for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo(); 
operator delete[] (manyFoos, pool); 

은 다시 전체 자주 묻는 질문 항목을 읽을 수 있고 당신이 그것을 발견 할 것이다.

+0

죄송합니다. 이해가 가지 않습니다. 이 명령문은'manyFoos' 배열을 어떻게 삭제합니까? 그리고 컴파일러는'operator delete'가 아닌'operator delete []'를 어떻게 호출 할 수 있습니까? – Tobias

+0

@Tobias : 오타가 있습니다. 고정 게시물. – dirkgently

+0

@Tobias : 배치 양식을 사용할 때 컴파일러가 자동으로 수행하는 작업을 자동으로 수행해야합니다. 1) 객체에서 dtor를 호출합니다. 2) 메모리를 확보합니다. 코드의 첫 번째 줄은 # 1을 처리합니다. 이제, 두 번째 줄은 배열 객체가있는 '풀'부분을 해제하는 작업을 처리합니다. – dirkgently