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;
}

s 是堆分配的 Type 类型的成员变量数组。

最佳答案

首先,使用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++中的Google Cloud Pubsub异步流API

c# - MFC中有没有类似DataGridView的控件

c - ARM EABI编译器中的memcpy()指令解释

c - 在 ANSI C 中将 Int 值序列化到 char* 缓冲区

gcc - 在不插入对 memcpy 的调用的情况下让 GCC 进行编译

C++ Matrix 类层次结构

c++ - 如何在没有删除运算符的情况下为堆对象调用析构函数?

c++ - Symbian C++ 和 Maemo 的代码覆盖工具

pointers - 有没有安全的替代方法可以将不安全的slice::from_raw_parts替换为原始指针?

对象的 C++ memcpy 拷贝出现损坏