2015-10-27 16 views
5

Xin lỗi, tôi không thể dán mã cụ thể.
Tôi hy vọng mẫu nhỏ này là đủ:Tại sao std :: list muốn gọi cấp phát của tôi không có đối số?

Hãy nói rằng tôi có một cấp phát như thế này:

template <class T> 
class MyAllocator 
{ 
// ... typedefs 

    MyAllocObject _allocObject; 

public: 
    MyAllocator() { 
    // _allocObject = new .. 
    } 

    MyAllocator(const MyAllocator& alloc) { 
     _allocObject = alloc.getAllocObject(); 
    } 

    template <class U> 
    MyAllocator(const MyAllocator<U>& alloc) { 
     _allocObject = alloc.getAllocObject(); 
    } 

    MyAllocator(const MyAllocObject& allocObject) { 
     _allocObject = allocObject; 
    } 

    inline pointer allocate(size_type size) { 
     return _allocObject->alloc(size); 
    } 

// other functions 
}; 

Và được sử dụng như thế này:

MyAllocObject object; 
MyAllocator<int> myAlloc(object); 
std::list<int, MyAllocator<int> > list(myAlloc); 

tôi có kinh nghiệm, mà nếu mặc định constructor bị thiếu, mã không biên dịch, vì vậy tôi đã thêm nó.
Nhưng vấn đề là, rằng tôi phụ thuộc vào đối số đó, bởi vì đó là những gì tôi sử dụng cho phân bổ bộ nhớ tùy chỉnh của tôi.

Tôi có thể làm gì trong trường hợp này?

+3

Trước khi C++ 11, allocators phải b ehave như-nếu không quốc tịch, tức là hai trường hợp cùng loại, bất kể chúng được intialized như thế nào, phải được trao đổi. (Yêu cầu này xuất phát từ các yếu tố chuyển động từ thùng chứa này sang vùng chứa khác) C++ 11 thêm yêu cầu cho người cấp phát nhà nước. Trước C++ 11, những người cấp phát phải cư xử như-nếu không quốc tịch, tức là hai trường hợp cùng loại, bất kể chúng được intialized như thế nào, phải được trao đổi. C++ 11 thêm yêu cầu cho người cấp phát nhà nước: http://stackoverflow.com/questions/6861046/compiler-support-for-stateful-allocators-in-stl-containers – peterchen

+1

Bạn đang làm việc với nền tảng, trình biên dịch và tùy chọn nào? – Niall

+0

@Niall: Tôi muốn mở rộng một chút trước khi đăng bài dưới dạng câu trả lời. Thực hiện :) - thật không may, tôi không thể tìm thấy một giới thiệu tốt đẹp để sử dụng phân bổ stateful. – peterchen

Trả lời

2

Trước khi C++ 11, việc triển khai STL được phép yêu cầu người cấp phát hành xử lý trạng thái vô quốc.

"cư xử như-nếu không quốc tịch" nghĩa STL có thể dựa vào phần sau đây để làm việc:

MyAllocator a1; 
void * p = a1.allocate(77, 0); 

MyAllocator a2; 
a2.free(p); 

(IIRC này đơn giản hoá thi hành một số hoạt động container.)

"được phép yêu cầu " nghĩa là việc triển khai STL có thể hỗ trợ những người cấp phát nhà nước (như của bạn), nhưng không phải.


C++ 11 yêu cầu hỗ trợ cho người cấp phát nhà nước.
Tôi không thể, tuy nhiên, tìm thấy một giới thiệu nhanh về điều đó (bất cứ ai muốn thêm điều đó?) This thread might give you some leads.


Nếu bạn đang bị ràng buộc để một trình biên dịch cụ thể mà không hỗ trợ allocators stateful, bạn có một vài lựa chọn không quá sáng bóng:

  • bao gồm một tham chiếu đến trạng thái của bạn như mẫu đối số của các cấp phát
  • trong phân bổ của bạn, bao gồm một back-link để bộ cấp phát trong câu hỏi (thường là phá hủy các mục đích của một cấp phát tùy chỉnh cho dữ liệu nhỏ)
Các vấn đề liên quan