template<typename T>
static T *anydup(const T *src, size_t len) {
T *ptr = malloc(len * sizeof(T));
memcpy(ptr, src, (len * sizeof(T)));
return ptr;
}
Это правильно? Могу ли я ожидать каких-либо ошибок при использовании int, long и т. Д.? Я очень плохо знаком с общим программированием и пытаюсь узнать больше.
Нет, это не правильно! Когда у вас есть malloc()
в коде C ++ вы должны стать очень подозрительным:
malloc()
выделяет память, но не создает объекты должным образом Единственный способ работы с такой памятью — использовать новое размещение. memcpy()
не уважает семантику копирования объектов C ++. Это может работать только с тривиально копируемыми классами. Я хотел бы найти трудно найти ошибки в другом месте (мелкие копии и другие ужасные вещи, которые приводят к UB). Для базовых типов, таких как char, int, double, это будет работать. Но не для более сложных типов.
Альтернатива 1: адаптировать код для правильного создания и копирования объектов
template<typename T>
T *anydup (const T *src, size_t len) {
T *ptr = new T[len]; // requires that T has a default constructor
copy (src, src+len, ptr); // requires that T is copyiable
return ptr;
}
Внимание: риск утечки памяти, если пользователь забудет удалить массив, или UB, если пользователь не использует сеть delete[]
! Чтобы избежать этого, вы можете выбрать возвращение unique_ptr<T[]>
,
Альтернатива 2: избавьтесь от массивов, указателей и ночных кошмаров памяти: используйте векторы!
template<typename T>
vector<T> anydup (const vector<T> src) {
vector<T> v(len); // requires that T has a default constructor
copy (src.cbegin(), src.cend(), v); // requires that T is copyable
return v;
}
Вы можете рассмотреть возможность создания вектора с использованием конструктора копирования, как это было предложено Реми Лебо и Ф.Диноффом в комментариях, либо в функции, либо непосредственно в коде использования.
Если вы используете copy()
непосредственно в коде использования, вы скоро обнаружите, что есть также copy_if()
, copy_backwards()
и некоторые другие хорошие <algorithms>
это может быть использовано в зависимости от обстоятельств.
Других решений пока нет …