2013-04-11 59 views
6

Tôi đang sử dụng std::unordered_map<void *, size_t> để giữ một số giá trị và tôi nhận được "chỉ số vectơ nằm ngoài phạm vi" khi thêm giá trị mới. Tôi đang sử dụng Visual Studio 2012 và các dấu vết lỗi là:std :: unordered_map vector subscript trong phạm vi

std::vector<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<std::pair<void * const,unsigned int> > > >,std::_Wrap_alloc<std::allocator<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<std::pair<void * const,unsigned int> > > > > > >::operator[](unsigned int _Pos) Line 1140 C++ 
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::_Vec_lo(unsigned int _Bucket) Line 907 C++ 
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::_End(unsigned int _Bucket) Line 936 C++ 
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::_Insert<std::pair<void * const,unsigned int>,std::_Nil>(std::pair<void * const,unsigned int> && _Val, std::_Nil _Pnode) Line 872 C++ 
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::insert(std::pair<void * const,unsigned int> && _Val) Line 371 C++ 

specificaly:

_Unchecked_iterator& _Vec_lo(size_type _Bucket) 
{ // return reference to begin() for _Bucket 
return (_Vec[2 * _Bucket]); 
} 

nơi _Vec là một vector rỗng và _Bucket là băm con trỏ (> 0). Điều tương tự cũng xảy ra khi loại khóa không có hiệu lực *, nhưng uintptr_t. Có phải đó là lỗi VS hay tôi đang làm điều gì sai?

Lưu ý: Câu hỏi này có liên quan đến c++ unorderedmap vector subscript out of range - đây là vấn đề tương tự, nhưng câu trả lời là không liên quan

+1

Vì vậy, mã ở đâu thực sự cố gắng thêm nội dung nào đó vào bản đồ này? – Chad

+0

'void * ScalableMemoryManager :: allocateAligned (size_t size, size_t alignment) { void * pointer = scalable_aligned_malloc (kích thước, căn chỉnh); nếu (con trỏ == nullptr) ném bad_alloc(); mTotalAllocated + = size; mSizes.insert (SizeMap :: value_type (con trỏ, kích thước)); ++ mTotalAllocations; con trỏ trả về; } ' – krojew

+0

Có phải' mSizes' có khả năng là thành viên toàn cầu hoặc lớp tĩnh không? –

Trả lời

1

Đó là một câu hỏi khá cũ và tôi không biết nếu câu trả lời của tôi phù hợp với câu hỏi này. Nhưng kể từ khi chúng tôi không nhận được thông tin bổ sung từ OP và tôi chạy vào cùng một lỗi thời gian chạy, tôi đang đăng giải pháp của mình cho vấn đề cụ thể của mình. Có lẽ ai đó thấy nó hữu ích.

Trong trường hợp của tôi, đó là sự cố khởi tạo đơn hàng tĩnh. Tôi truy cập vào unordered_map (là một thành viên lớp tĩnh) trước khi các thành viên tĩnh của lớp đó được khởi tạo.

Điều đó dẫn đến hành vi không xác định (truy cập các đối tượng không được khởi tạo) đã làm hỏng ứng dụng với lỗi thời gian chạy đó.

Cách giải quyết các sự cố khởi tạo đơn hàng tĩnh có thể được tìm thấy here.

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