堆叠C ++代码工作正常,但在运行代码结束时检测到“glibc”

时间:2014-01-22 19:09:27

标签: c++ pointers

我目前正在我的数据库类中使用“堆叠”,并且遇到“ * 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();


}

任何帮助或指示都将不胜感激! 代码似乎工作正常,只是一个错误...

2 个答案:

答案 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