c++ - 如何在不同类型的数组中正确使用 memcpy

标签 c++ memcpy

我有一个名为 Stack 的模板类有一个私有(private)方法 resize .

每当我使用 intdouble这个类的模板版本,它可以根据需要工作。但是,每当我使用 floatstring模板的版本,它崩溃了。我相信这是我的 memcpy 的问题函数调用。我应该如何正确使用它?

template <class Type>

void Stack<Type>::resize(int capacity) {
    if(capacity >= MAX_SIZE)
        capacity = MAX_SIZE;

    Type* copy = new Type[capacity];

    for (int i = 0; i < N; i++) {
        copy[i] = s[i];
    }

    s = new Type[capacity];

    memcpy(s, copy, sizeof(Type) * capacity);

    size = capacity;

    delete copy;
}
sType 类型的堆分配成员变量数组.

最佳答案

首先,使用memcpy是不正确的复制非 POD 类型。只需使用 for 循环,或 std::copy .

其次,你做的工作比必要的多(而且你有内存泄漏)。

void Stack<Type>::resize(int capacity) {
    if(capacity >= MAX_SIZE)
        capacity = MAX_SIZE;

    Type* copy = new Type[capacity];

    for (int i = 0; i < N; i++) {
        copy[i] = s[i];
    }

到这一步,你没事。您已经分配了一个新数组,并分配了旧数组中的元素。我假设 N是有效元素的数量。
s = new Type[capacity];

假设 s之前指向分配的数组,这是内存泄漏。首先,您需要删除以前的数据。
delete [] s;

然后,您不需要分配另一个数组。使用您刚刚分配的那个。
s = copy;

总之,函数现在看起来像这样:
template <class Type>
void Stack<Type>::resize(int capacity) {
    if(capacity >= MAX_SIZE)
        capacity = MAX_SIZE;

    Type* copy = new Type[capacity];

    for (int i = 0; i < N; i++) {
        copy[i] = s[i];
    }

    delete [] s;
    s = copy;
    size = capacity;
}

如果仍然存在问题,则代码的其他部分已损坏。

关于c++ - 如何在不同类型的数组中正确使用 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340473/

相关文章:

c++ - 插入二叉树指针错误

c++ - 与 int 乘 int 相比,为什么执行浮点乘浮点矩阵乘法更快?

c++ - C++中的TCP/Ip网络通讯

c - memcpy重写无法正常工作

C#将结构数组复制到 double 组

c++ - 有什么方法可以只用类运算符进行转换吗?

c++ - 在C++/Qt/Windows中控制Windows屏幕方向

c - 如何在 C 中修复 "free(): invalid next size (normal) | Canceled (memory dump written)"

在更新前比较(memcmp before memcpy),还是只更新,哪个性能更好?

c - 存储在带有一些空格的数组中