2010-02-24 22 views
8

Tôi muốn biết cách điều chỉnh section 11.14 of the C++-FAQ-lite thành các mảng.Làm thế nào để bạn khai báo và sử dụng toán tử pool bị quá tải xóa?

Về cơ bản, tôi muốn một cái gì đó như thế này:

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; 
} 

Tuy nhiên, tôi đã không thể tìm ra cú pháp chính xác để khai báo và gọi operator delete[] (pool) này. Ai có thể giúp đỡ ở đây?

Trả lời

1

Điều đó là không thể. Bjarne lý do mà bạn sẽ không bao giờ làm cho nó đúng tìm ra các hồ bơi chính xác. Giải pháp của ông là: bạn phải tự gọi tất cả các destructors và sau đó tìm ra các hồ bơi chính xác để có thể deallocate bộ nhớ bằng tay.

Tài liệu tham khảo:

Bjarne của FAQ: Is there a placement delete?

phần C++ tiêu chuẩn liên quan:

3.7.3.2.2 Chỉ điều hành viên xóa chức năng với một đối số kiểu size_t được coi cho các biểu thức xóa.

5.3.5.1 Xóa cú pháp biểu thức không cho phép tham số bổ sung.

2

Gọi dtors trên các đối tượng cá nhân đầu tiên và sau đó sử dụng:

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

Bạn có thể đọc toàn bộ danh mục Hỏi Đáp lại và bạn sẽ tìm thấy nó ở đó.

+0

Xin lỗi, tôi không hiểu. Câu lệnh này xóa mảng 'manyFoos' như thế nào? Và làm thế nào để trình biên dịch biết gọi 'toán tử delete []', không phải 'toán tử delete'? – Tobias

+0

@Tobias: Tôi bị lỗi đánh máy. Đã sửa bài đăng. – dirkgently

+0

@Tobias: Khi sử dụng biểu mẫu vị trí, bạn cần phải làm những gì trình biên dịch khác làm cho bạn tự động - 1) gọi dtor trên (các) đối tượng 2) giải phóng bộ nhớ. Dòng mã đầu tiên sẽ xử lý # 1. Bây giờ, dòng thứ hai, chăm sóc giải phóng phần đó của 'pool', nơi các đối tượng mảng của bạn xuất phát. – dirkgently

Các vấn đề liên quan