1
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 等时,我可以期待任何错误吗?我对通用编程非常陌生,并且正在努力学习更多。

4

1 回答 1

2

不,这是不对的!当你有一个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>

于 2016-09-25T18:20:57.250 回答