2014-12-09 17 views
5

Tôi biết trong hoàn cảnh bình thường làm thế nào để chăm sóc bộ nhớ de-phân bổ. Trường hợp của tôi hơi khác một chút.xóa nhà điều hành - cách triển khai?

Tôi đang triển khai nhóm bộ nhớ của riêng mình. Tôi muốn khách hàng của lớp học của tôi gần với phương pháp phân bổ và phân bổ chung.

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

tôi có chức năng toàn cầu này, vì vậy mà người dùng của lớp học của tôi chỉ đơn giản là có thể gọi

Base baseObj = new (poolObj)Base2();

Bây giờ tôi không biết làm thế nào để gọi destructor? Tôi clearl có NO IDEA

dù tôi có nhà điều hành toàn cầu xóa

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

xin vui lòng hướng dẫn .. làm thế nào tôi có thể nhận được chức năng này được gọi là từ mã khách hàng? Với những thay đổi nhỏ nhất đối với cú pháp từ phía người dùng. Cũng xin lưu ý rằng tôi không muốn người dùng mã của mình triển khai operator newoperator delete và gọi AllocateDeAllocate từ đó.

+0

Tại sao không chỉ có những người gọi 'Base * baseObj = poolObj.Allocate(); ' – Barry

+0

Cú pháp cho khách hàng có vẻ hơi xấu xí. 'Base * baseObj = (Base *) poolObj.Allocate()'. Yuck .. typecasting ... rằng mặc dù tôi đã giữ như là khu nghỉ mát cuối cùng .. Cũng kể từ khi không thể có được chức năng này được gọi là, tôi curous bây giờ .. – Adorn

+5

Vị trí xóa chỉ bao giờ được gọi từ bên trong vị trí mới, khi một nhà xây dựng thoát một ngoại lệ. Trong tất cả các trường hợp khác, một toán tử 'bình thường 'xóa (void *)' được gọi. Bạn có nghĩa vụ phải stash đầy đủ thông tin vào khối bộ nhớ được phân bổ để có thể deallocate nó sau này, không có đầu vào bổ sung. Thông thường, người cấp phát sẽ viết thông tin bổ sung tại offset âm từ con trỏ nó trả về. –

Trả lời

1

Các ngắn của nó: Với vị trí mới là trường hợp duy nhất mà gọi một cách rõ ràng destructor là OK:

baseObj-> ~ Base(); Tuy nhiên, điều này có vẻ rất hào nhoáng bởi vì, với bộ nhớ của bạn, bạn thực sự làm cho người dùng cuối thực hiện tất cả việc lưu giữ sách ... điều này làm cho lớp bộ nhớ của bạn không tốt hơn (và cho là hơi tệ hơn) std :: vector.

tôi sẽ không có người sử dụng làm Vị trí mới mình ... đúng hơn, nếu cung cấp hồ bơi bộ nhớ của riêng bạn, nó nên được thực hiện withing lớp ObjectPool:

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

Thành thực mà nói, đây là cách duy nhất để hồ bơi của bạn có thêm bất kỳ tiện ích nào thì người dùng cuối chỉ cần tự mình làm std::vector<uint8_t>.

Cần lưu ý rằng điều này không có gì để giữ T từ phân bổ bất cứ điều gì khác trên đống ...

+0

ok .. có lẽ bạn có thể khai sáng cho tôi nhiều hơn về câu hỏi thiết kế http://stackoverflow.com/questions/27375620/generic-memory-pool-how-to-design-issue Tôi không hoàn toàn nhận được những gì bạn đang cố gắng để nói – Adorn