Hi Hua,
On 07/31/18 17:18, Hua Meng wrote:
@@ -1997,12 +2004,40 @@ MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_clear( /* ?_Internal_compact@_Concurrent_vector_base_v4@details@Concurrency@@IEAAPEAX_KPEAXP6AX10@ZP6AX1PEBX0@Z@Z */ DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_compact, 20) void * __thiscall _Concurrent_vector_base_v4__Internal_compact(
_Concurrent_vector_base_v4 *this, MSVCP_size_t len, void *v,
{_Concurrent_vector_base_v4 *this, MSVCP_size_t element_size, void *v, void (__cdecl *clear)(void*, MSVCP_size_t), void (__cdecl *copy)(void*, const void*, MSVCP_size_t))
- FIXME("(%p %ld %p %p %p) stub\n", this, len, v, clear, copy);
- return NULL;
- compact_block *b;
- MSVCP_size_t size, seg_no, copy_element, clear_element;
- int i;
- TRACE("(%p %ld %p %p %p)\n", this, element_size, v, clear, copy);
- size = this->early_size;
- seg_no = _vector_base_v4__Segment_index_of(size - 1);
It will not work if size==0.
- if(this->first_block == seg_no + 1) return v;
The vector still needs to be compacted when there is unused space allocated. You should compare this->first_block with index of last allocated segment. The function is also returning NULL in this case.
Thanks, Piotr