每次我运行一个名为Loan& removeFirst(){}的方法时,我的程序都会继续崩溃。每当我尝试删除我创建的临时贷款结构时,程序就会崩溃。我可以展示容器类的一些背景和我的函数的代码:
class ListOfLoans {
public:
//default constructor allocate appropriate heap storage
//store elements on heap array declared like this:
//new Loan*[initial_size];
ListOfLoans(int initial_size = 4) {
elements = new Loan*[initial_size];
numberOfElements = 0;
capacity = initial_size;
index = 0;
}
~ListOfLoans(void) {
cout << "Deleting \n";
delete [] elements;
}
// answer the first element from the list but don't remove it
Loan & first() const {
if (capacity == 0) {
cout << "Attempted on empty list. Exitting!" << endl;
exit;
} else {
return *elements[0];
}
}
// answer the first element from the list and remove it from the list
// if the resulting list is more than three quarters empty release some memory
Loan & removeFirst() {
index--;
if (capacity == 0) {
cout << "Attempted on empty list. Exitting!" << endl;
exit;
}
if(size() < capacity/4) { //shrink the container when 1/4 full
cout << "shrinking\n";
Loan **temp = elements;
elements = new Loan*[capacity/2];
for(index = (numberOfElements - 1); index >= 0; index--) {elements[index] = temp[index];}
capacity /= 2;
delete [] temp; // my program crashes at this line, I want to delete the temp structure
}
return first();
}
private:
Loan ** elements;
int numberOfElements; //number of elements in the list
int capacity; //size of the available array memory
mutable int index; //used to help with the iteration
};
答案 0 :(得分:1)
删除指针数组(指向指针的指针)时,通常会执行以下操作:
for(int i = 0; i < capacity; ++i)
{
delete temp[i];
}
delete [] temp;
如果没有for循环,您将泄漏内部指针中的内存。
size()是否返回numberOfElements?我在这里的一个问题是你的for循环将数据从temp复制到元素中,并且可能在temp范围之外开始。如果是这种情况,您可能会覆盖可能导致崩溃的内存。为什么不从0循环到size()?如果要删除第一个元素,只需使用以下内容复制它:
elements[index] = temp[index+1];
最后,如果要删除列表中的第一个元素,first()会在内部执行什么操作?从我上面看到的情况来看,您似乎已经删除了第一个元素,或者已经打算删除。如果它被删除,它可能会在你返回它时删除,所以你需要在本地复制那个指针并让你的for循环删除所有元素跳过第一个,这样你就有了一些有效的东西可以返回! / p>
答案 1 :(得分:1)
您没有提供size()的实现。它只返回numberOfElements吗?如果没有,这可能是你的问题。如果numberOfElements&gt;容量/ 2,你的循环破坏了堆,最终导致崩溃。
如果size()返回numberOfElements,我会看到此代码存在很多问题,但考虑到您提供的信息,我看不到崩溃的来源。