我目前正在我的数据库类中使用“堆叠”,并且遇到“ * glibc detected * ”的问题。根据我的理解,这是一个访问不存在的内存或从其他来源泄漏内存的问题。我经历了好几次,我看不出有什么记忆被泄露等等。
我们的任务是创建一个动态堆叠程序。
我的代码由三个文件组成,但我将它们全部编译成一个cpp:
//#include <dstack.h>
#include <iostream>
#include <stdexcept>
using namespace std;
class DStack
{
private:
int *p;
int *t;
int length;
public:
DStack();
~DStack();
void push(int);
int pop();
void display();
};
DStack::DStack()
{
length=0;
cout<<"Stack has been created!"<<endl;
p=new int[length];
}
DStack::~DStack()
{
delete [] p;
}
void DStack::push(int elem)
{
t = new int[length+1];
for ( int i = 0; i < length; i++ )
{
t[i] = p[i];
}
p = t;
p[length] = elem;
delete [] t;
length++;
cout<<length;
}
int DStack::pop()
{
t = new int[length-1];
int ret = p[length-1];
for ( int i = 0; i < length-1; i++ )
{
t[i] = p[i];
}
p = t;
delete [] t;
length--;
return ret;
}
void DStack::display()
{
cout<<length<<": ";
for(int i = 0; i < length; i++)
cout<<p[i]<<" ";
cout<<endl;
}
//main.cpp
//#include <dstack.h>
int main()
{
cout<<"Enter a size for stack : ";
DStack s1;
s1.push(1);
s1.display();
s1.push(2);
s1.push(3);
s1.push(4);
s1.push(5);
s1.display();
s1.pop();
s1.display();
s1.pop();
s1.display();
s1.pop();
s1.display();
s1.pop();
s1.display();
s1.pop();
s1.display();
}
任何帮助或指示都将不胜感激! 代码似乎工作正常,只是一个错误...
答案 0 :(得分:2)
在push
代码中
p = t;
p[length] = elem;
delete [] t;
删除新数组并泄漏旧数组。你需要做
delete [] p;
p = t;
p[length] = elem;
代替。
pop
中存在类似的错误。您可能会发现在此处不重新分配更容易,而只是使用较少的数组。如果您执行此操作,则还需要存储size
成员并将push
更改为仅在size == length
答案 1 :(得分:1)
我在push
中看到了一个问题:
p = t;
p[length] = elem;
delete [] t;
由于t等于p,您将删除刚分配的内存,然后访问已删除的内存。我猜你在delete[] p
p = t