首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板化的'strdup()'?

模板化的'strdup()'?
EN

Stack Overflow用户
提问于 2016-09-25 17:59:39
回答 1查看 214关注 0票数 1
代码语言:javascript
复制
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等时,我可以预期会有任何错误吗?我对通用编程非常陌生,我正在努力学习更多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-25 18:20:57

不,这不合适!当您在malloc()代码中使用C++时,您应该会变得非常可疑:

  • malloc()分配内存,但没有正确地创建对象。使用这种内存的唯一方法是使用一个新的位置。
  • memcpy()不尊重C++对象的复制语义。这只能适用于微不足道的可复制类。我会在其他地方很难找到bug(浅薄的拷贝,以及导致UB的其他可怕的事情)。

对于char、int、double这样的基本类型,它可以工作。但不适合更复杂的类型。

备选方案1:调整代码以正确创建和复制对象

代码语言:javascript
复制
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:去掉数组、指针和内存噩梦:使用向量!

代码语言:javascript
复制
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>,它们可以根据具体情况使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39690024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档