gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:01:49 25 4
gpt4 key购买 nike

我有一个名为 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/

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