gpt4 book ai didi

c++ - 一个模板化的 'strdup()' ?

转载 作者:行者123 更新时间:2023-11-30 03:38:15 26 4
gpt4 key购买 nike

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 等时,我可以预期会出现任何错误吗?我是泛型编程的新手,正在尝试了解更多信息。

最佳答案

不,这不合适!当你有一个 malloc()在 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:摆脱数组和指针以及内存噩梦:使用 vector !

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 在评论中的建议,在函数中或直接在使用代码中使用复制构造函数来创建 vector 。

如果您使用 copy()直接在using代码中,你很快就会发现还有copy_if() , copy_backwards()和其他一些不错的 <algorithms>可以根据情况使用。

关于c++ - 一个模板化的 'strdup()' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com