Использование памяти, выделенной другим распределителем - PullRequest
4 голосов
/ 12 января 2012

Предположим, у меня есть класс с именем vector, который поддерживает некоторый внутренний динамический массив типа T, выделенный std::allocator<T>. Теперь я создаю vector типа U, а позже хочу использовать семантику перемещения так что я могу использовать потребляемую им память для vector типа T, вот так:

vector<unsigned> u(512);
// Do something with v.
vector<double> t = std::move(u);
// Do something with t.
// Later, t gets destroyed.

Безопасно ли для меня использовать память, выделенную распределителем u в конструкторе перемещения t, и впоследствии освободить ее с помощью распределителя t? Если это так, что я должен сделать, чтобы эта операция была безопасной? Я предполагаю, что сначала я должен вызвать allocator.destroy() для каждого элемента внутреннего массива u, используя распределитель u.

1 Ответ

2 голосов
/ 12 января 2012

Да, это один из целевых проектов STL, что память, выделенная одним распределителем, может быть освобождена другим.Это потому, что они хотели иметь возможность менять элементы между контейнерами (например, с list::splice) без необходимости что-либо делать со своими распределителями.Вот почему (одна из причин) почему у вас не может быть распределителей с сохранением состояния.

...