Собственный пользовательский векторный класс.Перераспределение памяти - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу реализовать свой собственный простой векторный класс.Этот вектор должен поддерживать добавление новых элементов (типа T), даже если зарезервированная память исчерпана.Итак, мне нужно выделить новый блок памяти, скопировать в него элементы и затем освободить старый блок памяти.

Если я создаю блок памяти, используя new T[], то я должен освободить его, используя delete[], который создаст конструкторы каждого элемента в векторе, который будет вызван.Я не хочу этого, потому что думаю просто скопировать старый вектор, используя memcpy().

Итак, я принял решение выделить память, используя new char[] и использовать размещение нового для заполнения массива.Когда мне нужно перераспределить зарезервированную память, я просто использую memcpy() в этом блоке памяти и затем освобождаю ее, используя delete[].

Это разумное решение?

1 Ответ

0 голосов
/ 24 сентября 2018

Существуют только определенные объекты, которые (как и разрешено) должны быть "скопированы" с помощью memcpy.Они называются тривиальными типами - у которых не может быть пользовательских деструкторов.

Таким образом, использование memcpy во избежание вызова деструкторов противоречиво.Вы можете делать первое только в том случае, если последнее не нужно.

Учтите это: как правило, T может иметь указатели / ссылки на своих собственных членов (или другие T в том же векторе).Если вы перемещаете эти объекты с помощью memcpy, они будут продолжать ссылаться на старые (теперь недействительные) области памяти.Это именно то, с чем должны обращаться конструкторы и деструкторы T (если копирование / перемещение их даже разрешено), поэтому их пропуск приведет к проблемам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...