我的程序崩溃导致内存堆损坏错误。 有问题的代码块仅在下面描述 - 问题出现在“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;
}
答案 0 :(得分:1)
您的问题可能是由于您没有定义复制构造函数或复制赋值运算符,并且(某处)尝试复制您的队列。这将复制指针的值,但是当它超出范围时,将释放内存。然后另一个副本超出范围并尝试释放已释放的内存。
您可以按照Rule of 3
修复此问题答案 1 :(得分:0)
我遇到的问题不是因为我没有定义复制构造函数或者我没有重载=运算符。 这是因为我正在访问已分配数组的未定义内存块。 显然:我定义了N个元素的数组,但我只使用了N中的N-10。 在程序的某个点上,我在一些定义的N-10元素和一些未定义的10个元素之间进行交换。这是导致崩溃的错误。 无论如何,感谢大家回答我的问题。