簡體   English   中英

析構函數導致分段故障

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM