我有一个名为 Stack
的模板类,它有一个私有(private)方法 resize
。
每当我使用此类的 int
或 double
模板版本时,它都会按预期工作。但是,每当我使用模板的 float
或 string
版本时,它就会崩溃。我认为这是我的 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/