[英]Destructor causes Segmentation Fault
我知道這里有很多類似的問題,但是我還沒有發現任何有用的問題。 我已經呆了幾個小時了,這讓我發瘋了。 當由復制構造函數創建的變量調用析構函數時,出現分段錯誤。
//Copy Constructor
Stack::Stack(const Stack &aStack)
{
size = 0; //this is incremented as new items are pushed onto the stack.
cap= aStack.cap;
items = new int[aStack.cap]();
for (int i = 0; i < aStack.size; i++)
this->push(aStack.items[i]); //Adds an item if not full and increments size
// I have also tried: items[i] = aStack.items[i]
}
//Destructor
Stack::~Stack()
{
cap= 0;
size= 0;
delete [] items;
items = NULL;
}
我感覺到我在做拷貝構造函數時做錯了,但是我不知道它是什么。
該行:
for (int i = 0; i < aStack.top; i++)
應該:
for (int i = 0; i < aStack.size; i++)
這是段錯誤,因為您可能試圖訪問超出范圍的索引或類似的內容(未定義的行為區域)。
好吧,我找到了。 我會把它放在這里給像我一樣愚蠢的人(缺乏基本的c ++知識),這樣他們就不用花很多時間去尋找和我一樣的東西。
我的問題是析構函數似乎在“選擇性地”工作。 它在某些測試中有效,但在其他測試中卻失敗。 在比較了幾個小時的測試后,我終於找到了它。
失敗的測試通過測試pop函數來完成,一直進行到堆棧為空為止。 在我的析構函數中,有一行顯示delete [] items;
除非我的pop函數有一行讀取items[size-1] = NULL;
的行,否則一切都很好items[size-1] = NULL;
因此,從某種意義上說,每次pop刪除一個項目時,在調用析構函數之前,該項目都會被清空/刪除。 由於我非常了解c ++,因此我不知道delete命令無法處理空數組。 因此,我只是擺脫了提前刪除項目的行(本質上,對於最終用戶,由於封裝原因,該項目不再存在。頂部索引仍然更改,因此不再可訪問)
無論如何,最后一課: delete [] items
; 不處理空數組(我想這是有道理的。delete命令期望一個數組比我最終的數組長得多)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.