我正在尝试创建一个带有一个类的c ++程序,该类在“堆”上保存整数,并且只有一个方法,pop()返回类中的第一个项目并将其删除。到目前为止,这是我的代码:
#include <iostream>
using namespace std;
class LinkList {
int *values; //pointer to integers stored in linklist
int number; // number of values stored in linklist
public:
LinkList(const int*, int); // Constructor (method declaration)
int pop(); // typically remove item from data structure (method declaration)
};
LinkList::LinkList(const int *v, int n){
number = n;
*values = *v;
int mypointer = 1;
while (mypointer<n) {
*(values+mypointer) = *(v+mypointer);
mypointer++;
}
}
int LinkList::pop() {
if (number>0) {
int returnme = *values; //get the first integer in the linklist
number--;
values++; //move values to next address
return returnme;
}
else {return -1;}
}
int main() {
int test[] = {1,2,3,4,5};
LinkList l1(test,5);
cout << l1.pop() << endl;
LinkList l2(test,5);
cout << l2.pop() << endl;
return 0;
}
问题是它在行* values = * v失败,如果我从main方法中删除第4行和第5行,我不再遇到这个问题,所以它将成为内存管理的事情。
我想要做的是让值指向一个带有整数的连续内存。我试图使用数组但是只保留pop()
返回的随机内存地址背景:正常我在java中编程,我只使用C / C ++ 2个月,我在ubuntu中使用eclipse IDE,我可以非常基本地使用调试器但是目前我还没有运行滚动条在日食中,如果它们不适合我的屏幕,我就不能做些事情。
答案 0 :(得分:4)
您在未定义行为(UB)的行values
处取消引用未初始化的指针(*values = *v;
)。这一行说的是“获取values
指向的整数,并为其指定v
指向的值”。这种逻辑的问题是values
还没有指向任何东西。这个UB的结果就是你收到的崩溃。
此代码还有许多其他问题,例如将const int*
传递给构造函数以修改这些值。最大的问题是这不是一个真正的链表。
答案 1 :(得分:1)
也许问题是你正在增加一个整数 - mypointer,而不是一个指针。如果整数需要多个字节的空间,则可能会导致错误。您可以尝试声明一个指针并将其递增吗?
答案 2 :(得分:1)
*values = *v;
在初始化之前,您取消引用此行中的values
指针。这是后来错误的来源,main
的前三行中的非错误仅仅是因为运气。您必须通过values = new int[n]
分配空间,并通过delete[] values
在析构函数中释放它。 std::vector
以干净,安全的方式为您工作。
答案 3 :(得分:1)
values
成员变量是指向未初始化内存的指针。在开始将数字复制到其中之前,必须将其指向有效的内存。例如:
LinkList::LinkList(const int *v, int n){
number = n;
values = new int[n]; // allocate memory
int mypointer = 0;
while (mypointer<n) {
*(values+mypointer) = *(v+mypointer);
mypointer++;
}
}
LinkList::~LinkList() {
delete values; // release memory
}
另外,为什么你把它称为链表,而实际上你正在使用存储器阵列存储你的数字?