gpt4 book ai didi

c++ - 动态数组调整大小函数问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:48 26 4
gpt4 key购买 nike

注意:我知道只使用 STL Vector 会更容易,但是,对于我所在的编程类(class),我们需要编写自己的动态数组模板类,因为我们的教授显然喜欢让我们重新发明轮子。

无论如何,我为我的动态数组模板类创建了一个调整大小的函数,如下所示。注意私有(private)成员变量是T* arr,unsigned used,unsigned cap。

template <class T>
void darray<T>::resize(unsigned size)
{
if (size > cap)
{
T* temp_arr = new T[size];

for (int count = 0; count < used; ++count)
temp_arr[count] = arr[count];

for (int count = used; count < size; ++count)
temp_arr[count] = T();

delete []arr;
arr = temp_arr;
cap = size;
used = size;
}

if (size < cap)
{
used = size;
}
}

每当我使用这个函数来增加数组的大小时,它会在我第一次需要使用它时起作用,但之后,Visual Studios 会在第 14 行触发一个断点 (delete[] arr),如果我继续超过中断,我最终会得到 _CrtIsValidHeapPointer(pUserData) 断言失败。是什么原因造成的,我该如何解决?

构造函数:

template <class T>
darray<T>::darray()
{
used = 0;
cap = 64;

arr = new T[cap];

for (int count = 0; count < cap; ++count)
arr[count] = T();

赋值运算符:

template <class T>
darray<T>& darray<T>::operator= (const darray& right_operand)
{
delete[] arr;
arr = new T[right_operand.capacity()];
used = right_operand.size();
cap = right_operand.capacity();

for (int count = 0; count < used; ++count)
arr[count] = right_operand[count];
return *this;
}

析构函数:

template <class T>
darray<T>::~darray()
{
delete[] arr;
}

有一些对 push_back 函数的请求,所以这也是:

template <class T>
void darray<T>::push_back(const T& input)
{
if ((used + 1) > cap)
{
resize(cap * 2);
arr[used + 1] = input;
++used;
}

else
{
arr[used] = input;
++used;
}
}

最佳答案

您的resize 函数增加了used。当您在 push_back 中访问 arr[used+1] 时,您访问了一个无效的数组位置。

您应该添加另一个函数,它类似于resize,但只改变数组的容量而不改变存储对象的数量。 (即它不会增加 used)。此函数应由 push_back 调用。 (正如您在问题中提到的 std::vector ,请查看 vector::resizevector::reserve 之间的区别。)

此外:数组索引是从零开始的。不要在 used + 1 位置插入,而是在 used 位置插入。

关于c++ - 动态数组调整大小函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23214074/

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