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()
in 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;
}
您可以考虑使用 Remy Lebeau 和 FDinoff 在注释中建议的复制构造函数创建向量,无论是在函数中还是直接在使用代码中。
如果你copy()
直接在 using 代码中使用,你很快就会发现还有copy_if()
,和其他一些可以根据情况使用 copy_backwards()
的不错的东西。<algorithms>