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等时,我可以预期会有任何错误吗?我对通用编程非常陌生,我正在努力学习更多。
发布于 2016-09-25 18:20:57
不,这不合适!当您在malloc()代码中使用C++时,您应该会变得非常可疑:
malloc()分配内存,但没有正确地创建对象。使用这种内存的唯一方法是使用一个新的位置。memcpy()不尊重C++对象的复制语义。这只能适用于微不足道的可复制类。我会在其他地方很难找到bug(浅薄的拷贝,以及导致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;
}注意:如果用户忘记删除数组,内存泄漏的风险;如果用户不使用delete[],则使用UB!为了避免这种情况,您可以选择返回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和FDinoff在注释中建议的复制构造函数来创建向量,无论是在函数中还是直接在使用代码中。
如果在使用代码中直接使用copy(),您很快就会发现还有copy_if()、copy_backwards()和其他一些很好的<algorithms>,它们可以根据具体情况使用。
https://stackoverflow.com/questions/39690024
复制相似问题