【问题标题】:copying then deleting a dynamic array复制然后删除动态数组
【发布时间】:2013-11-26 16:10:14
【问题描述】:

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

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
}

Item 在类中定义如下:

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;
}

【问题讨论】:

  • 1.你的班级似乎违反了三人制。 2. 只需使用std::arraystd::vector
  • 您忘记向我们提供实际调用您在此处显示的函数的代码。但是,如果queuesize 符合我的想法,您应该在该函数中将其设置为capacity

标签: c++


【解决方案1】:

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

您可以通过关注Rule of 3 来解决此问题

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-30
      • 2021-05-12
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      相关资源
      最近更新 更多