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等时,我可以期待任何错误吗?我对通用编程非常陌生,我正在努力学习更多内容。
答案 0 :(得分:2)
不,这不合适!当你在C ++代码中有malloc()
时,你应该变得非常怀疑:
memcpy()
分配内存,但没有正确创建对象。使用此类内存的唯一方法是使用新的展示位置。 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;
}
不尊重C ++对象的复制语义。这只适用于简单的可复制课程。我会很难在其他地方发现错误(浅拷贝,以及导致UB的其他可怕的事情)。 对于像char,int,double这样的基本类型,它会起作用。但不适用于更复杂的类型。
备选方案1:调整代码以正确创建和复制对象
delete[]
注意:如果用户忘记删除阵列,则存在内存泄漏的风险;如果用户donet使用unique_ptr<T[]>
,则为UB!为避免这种情况,您可以选择返回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;
}
。
备选方案2:摆脱数组和指针以及内存噩梦:使用向量!
copy()
您可以考虑使用Remy Lebeau和FDinoff在评论中建议的复制构造函数来创建向量,无论是在函数中还是直接在使用代码中。
如果您在使用代码中直接使用copy_if()
,您很快就会发现还有copy_backwards()
,<algorithms>
和其他一些不错的HTTP
根据具体情况使用。