正在堆中创建和使用数组
Creating and using array in Heap
作为我研究的一部分,我们正在学习使用"堆",并被要求编写一个简短的数学程序,使用指针来引用和尊重堆。作为一点个人学习,我试图用一个数组来复制它,通过创建一个数组并在上面使用二进制搜索。但它根本不起作用。
这是我的代码:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
//creating pointers
int* ii = new int;
int* top = new int;
int* bottom = new int;
int* uArray = new int[12];
int* uChoice = new int;
//assigning values in location of pointer
*ii = 5;
*top = 11;
*bottom = 0;
cout<<"Please input a value between 1 and 12 to find in the array: t";
cin >> *uChoice;
for (int x = 0; x<12; x++) //adding values into the array
{
uArray[x] = x;
cout<<x;
Sleep(1000);//checking loop works
}
while (uArray[*ii] != *uChoice)
{
if (uArray[*ii] > *uChoice)
{
*bottom = *ii;
*ii = (*top + *bottom)/2;
}
else
{
*top = *ii;
*ii = (*top + *bottom) /2;
}
if (*uChoice == *ii)
{
break;
}
}
//clearing pointers.
delete ii;
delete top;
delete bottom;
delete uArray;
ii = 0;
top = 0;
bottom = 0;
uArray = 0;
cout<<uChoice<<" Found at position: t"<< *ii;
Sleep(10000);
return 0;
}
非常感谢。
[编辑:]错误发生在while循环中。发生了一些情况,这意味着它没有正确搜索数组。对不起,我没有澄清。
此外,当指针指向数组时,必须使用delete[]uArray语法,否则内存将无法正常释放。
不确定这是否是"不起作用"的部分,因为你没有更具体。
从技术上讲,Standard没有定义"堆",但就实现而言,new
在Freestore上创建元素,而不是堆。malloc()
在堆上创建元素。
阅读良好:
GotW#9:内存管理-第一部分
当你这样做时,你有一个未定义的行为潜伏:
int* uArray = new int[12];
delete uArray;
您需要:
delete []uArray;
while循环在数组中找不到正确元素的原因与指针的使用无关。我可以直接给你答案,但你自己找到它会更有用(在你看下面的剧透之前)。
我建议您尝试在调试器中运行代码。如果你以前没有使用过调试器,我强烈建议你尝试一下。在while循环开始时设置一个断点。您可能会发现在一张纸上写下uArray[]数组的内容以供参考很有用。然后一次遍历while循环一行,仔细注意if语句——它是进入if子句还是进入else子句,因此它是移动*top还是*bottom。与uArray[*ii]相比,考虑到*uChoice的值,看看发生的事情是否有意义。
这是一个微不足道的错误,一旦发现它,你会后悔的。但更有用的教训是如何调试代码。
(如果你没有调试器,你可以通过在while循环中插入一些cout语句来打印出关键变量的值来达到同样的效果。)
以下是答案(鼠标悬停查看):
在比较uArray[*ii]和*uChoice的测试中,大于运算符应该是小于。如果您正在搜索的数字小于数组中的值,则您知道它在下半部分,因此您希望将顶部向下,而不是底部向上移动。
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为