Шаблонный strdup ()?

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 и т. Д.? Я очень плохо знаком с общим программированием и пытаюсь узнать больше.

1

Решение

Нет, это не правильно! Когда у вас есть 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> это может быть использовано в зависимости от обстоятельств.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]