模板化的' strdup()&#39 ;?

时间:2016-09-25 17:59:39

标签: c++ templates memcpy 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 个答案:

答案 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根据具体情况使用。