gpt4 book ai didi

c++ - 段错误 - 已使用新的和删除的。在运行时正在创建大量数组(无界数组)

转载 作者:太空宇宙 更新时间:2023-11-04 15:40:59 25 4
gpt4 key购买 nike

我正在尝试实现一个无界数组:What is an unbounded array?

此页面的更多详细信息: http://www.cs.cmu.edu/~fp/courses/15122-s11/lectures/12-ubarrays.pdf

这是代码:

#include <iostream>
#include <cstdlib>

using namespace std;

class UBArray
{
public:

int *arr, *arrN, j, *pos; //Initial array is arr. The position of arr is stored in pos. arrN is the new array created when size = limit.
int size, limit; //size is the current size of the array and limit is the total size available untill a new array is created.

UBArray()
{
size = 0;
limit = 10;
arr = new int[10];
pos = arr;
}

private:

void increment()
{
// New array arrN is created and then the values in the old arrays is put into the new array.
// Limit is increased by 10 - this is the extra space the new array contributres.
// pos which carries the address of the current array now carries the address of the new array.
// Later when a new array is created its address will be on the heap which is empty. This address is replace the address stored
// in the arrN. The older array can still be accessed for the array updation process by using the variable pos.

// IMPORTANT: I had initially tried to delete the older array to space space but while trying to debug the segmentation fault, I have
// removed it. I will be adding it again once the error has been fixed.

arrN = new int[size + 10];
for (j = 0; j < size; j++)
{
arrN[j] = pos[j];
}
limit = limit + 10;
pos = arrN;
}

public:

void push(int n)
{
if (size<limit)
{
size++;
pos[size-1]=n;
}
else
{
increment();
push(n);
}
}
int pop()
{
int p = pos[size-1];
size--;
return p;
}
};


int main()
{
UBArray array;
int num;
cout << "Enter 36 elements: ";
for (int k = 0; k<36; k++)
{
cin >> num;
array.push(num);
}
cout << endl << "The last element is : " << array.pop();
}

我已尝试在代码中提供注释,以使其易于读者理解。我在这里复制了一些:

初始数组是arr。 arr 的位置存储在 pos 中。 arrN 是当size = limit 时创建的新数组。

size 是数组的当前大小,limit 是在创建新数组之前可用的总大小。

创建新数组arrN,然后将旧数组中的值放入新数组中。

Limit 增加了 10 - 这是新数组贡献的额外空间。

pos 携带当前数组的地址,现在携带新数组的地址。

稍后当创建一个新数组时,其地址将位于空堆上。该地址被替换为 arrN 的地址。通过使用变量 pos 仍然可以访问旧数组以进行数组更新过程,该变量将由已复制到新值的旧值进行更新。

我在执行期间遇到段错误。我曾尝试使用 cout 语句来调试代码,但它看起来确实令人困惑。我可以在 increment 方法中看到 for 循环内外的循环。我想不通。感谢您的帮助。

更新:正如 jrok 所指出的,我更改了代码并且段错误消失了。但是我在创建第三个数组时再次遇到段错误。

更新 2 现在一切都已修复。谢谢。

最佳答案

arr = new int(10*sizeof(int));

这会创建一个 int,初始化为 10*sizeof(int) 的值。您在此语句后立即编写的循环越界,这是导致段错误的原因。

你要的是new的数组形式:

arr = new int[10]; // note 10 only, new expression knows the size
// of the type it allocates

请注意,当您将指向新数组的指针分配给指向旧数组的指针时,您将失去它的句柄并造成内存泄漏:

int* arr = new int[10];
int* new_arr = new int[20];
arr = new_arr; // original array at arr has leaked

在重新分配之前,您需要delete[] arr。另外,我认为第三个 (pos) 指针没有用处。对于 arrN,就此而言也不行。一个就可以了。在 increment 中创建一个本地指针,并在完成旧数组的释放后将其分配给 arr

最后,人们在评论中告诉您的是,除非这是一个学习练习,否则不要尝试重新发明轮子并改用 std::vector

关于c++ - 段错误 - 已使用新的和删除的。在运行时正在创建大量数组(无界数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23244350/

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