Аллокатор стандартной библиотеки
Я пишу свою реализацию контейнера vector. Не могу разобраться с правильным перераспределением памяти. Ниже код, так я перезаписываю память сейчас, частично он взят из примера в интернете, так же из реализации vector. Мой вопрос в следующем: сейчас новые объекты при перезаписи конструируются и старые разрушаются, мне кажется это не логичным, почему нельзя менять указатель на объект, не трогая сам объект? Но сколько я ни пытался, у меня не получается это сделать и если код вообще компилируется, то появляются утечки. Буду благодарен объяснению или статье где затронуто перераспределение памяти на аллокаторе.
int main()
{
int n = 10;
std::string str = "jhrwebvkbekjvnkejnrvkjnekjrvnekjrvkjenrkjvnejkrnvkernvkjnerkvnekrjnvkjernvkjerv";
std::allocator<std::string> alloc;
std::allocator<std::string>::pointer start;
std::allocator<std::string>::pointer end;
start = alloc.allocate(n);
end = start;
//write
for (int i = 0; i < n; i++)
{
alloc.construct(end, str);
end++;
}
std::allocator<std::string>::pointer new_start = alloc.allocate(n);
std::allocator<std::string>::pointer new_end = new_start;
//rewrite
for (int i = 0; i < n; i++)
{
alloc.construct(new_end, *(start + n));
new_end++;
}
//free
while(end != start)
{
alloc.destroy(end);
end--;
}
alloc.destroy(end);
alloc.deallocate(start, n);
//free end
start = new_start;
end = new_end;
//free
while(end != start)
{
alloc.destroy(end);
end--;
}
alloc.destroy(end);
alloc.deallocate(start, n);
//free end
return 0;
}```
Ответы (1 шт):
Ваши циклы с
destroy()вылезают на 1 за границы массивов. Правильно так:while(end != start) { end--; alloc.destroy(end); } // Тут второй `destroy()` не нужен.Опечатка:
*(start + n)->*(start + i),В C++20 из стандартного аллокатора были удалены
::pointer,.construct,.destroyи прочее. Оставили.allocateи.deallocate.Правильно:
std::allocator_traits<std::allocator<std::string>>::pointerstd::allocator_traits<std::allocator<std::string>>::construct(аллокатор, указатель, аргументы...)std::allocator_traits<std::allocator<std::string>>::destroy(аллокатор, указатель)
почему нельзя менять указатель на объект, не трогая сам объект?
Тут не очень понял. У объекта фиксированный адрес. Если хочется подвинуть его в в другое место, можно только создать новый объект, а старый удалить.