- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试实现一个无界数组: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/
我有一个Foldable的Integer s 是无界的,因此我无法应用 Max折叠到它。 定义 Max 有意义吗? Nothing 的实例当一个值不存在时?有Ord a => Semigroup (M
我有两个简单的问题。我有一个 LinkedBlockingQueue,我将其简单地创建为 新的 LinkedBlockingQueue() 所以我认为这保证是无限的,对吗? 如果确实如此,那么说在此队
是否可以在未指定边界之一的情况下使用 git bisect。例如,如果我发现 HEAD 上有问题但我怀疑它在过去在某个时候有效,有没有办法告诉 git “尝试一次提交之前,如果那不起作用尝试两次提交之
我是一名优秀的程序员,十分优秀!