复制然后删除动态数组

时间:2013-11-26 16:10:14

标签: c++

我的程序崩溃导致内存堆损坏错误。 有问题的代码块仅在下面描述 - 问题出现在“delete [] p;”怒吼 这个块代码的目的是调整数组的大小(项目 - 在类头中定义) 为了做到这一点,  1.我使用新的适当容量分配一个新阵列(副本)。  2.我将旧数组(项)复制到新的(调整大小的)数组“副本”中。  然后我尝试删除副本,因为我不再需要它了 我当然在最后一点做错了。 如何正确地做到这一点? - 表示如何正确释放“复制”处理的内存 避免内存泄漏?

template <class Item> void MinPQ<Item>::resize(int capacity)
{
    Item *copy = new Item[capacity];//capacity = stack size


    for(int i = 0; i < N; ++i)
    {
        copy[i] = items[i];
    }
    Item *p = items;
    items = copy;
    delete[] p;

    p = NULL;//avoid dangling pointer
}

项目在课程中定义如下:

template <class Item> class MinPQ
{
    private:

        Item *items;
        int queueSize;
        int N;

        void resize(int capacity);
        bool greater(int i, int j);
        void exch(int i, int j);
        void swim(int k);
        void sink(int k);

    public:

        MinPQ();
        ~MinPQ();
        void insert(Item item);
        Item delMin();
        void print();
        inline int size(){return N;}
        inline bool isEmpty(){return N == 1;}
};

构造函数和析构函数定义如下:

template <class Item> MinPQ<Item>::MinPQ()
{
    queueSize = 2;
    N = 0;
    items = new Item[queueSize];
}

template <class Item> MinPQ<Item>::~MinPQ()
{
    delete [] items;
    items = NULL;
}

2 个答案:

答案 0 :(得分:1)

您的问题可能是由于您没有定义复制构造函数或复制赋值运算符,并且(某处)尝试复制您的队列。这将复制指针的值,但是当它超出范围时,将释放内存。然后另一个副本超出范围并尝试释放已释放的内存。

您可以按照Rule of 3

修复此问题

答案 1 :(得分:0)

我遇到的问题不是因为我没有定义复制构造函数或者我没有重载=运算符。 这是因为我正在访问已分配数组的未定义内存块。 显然:我定义了N个元素的数组,但我只使用了N中的N-10。 在程序的某个点上,我在一些定义的N-10元素和一些未定义的10个元素之间进行交换。这是导致崩溃的错误。 无论如何,感谢大家回答我的问题。