使用GDB調試segment fault

在Linux下編寫C/C++程序,常常會遇到segment fault的錯誤。c++

segment fault錯誤##

segment fault出現有下列緣由:數組

  • 壞指針錯誤 :在指針賦值以前就用它來引用內存
  • 改寫錯誤 :越過數組邊界寫入數據,在動態分配的內存空間之外寫入數據,或改寫一些堆管理數據結構
  • 指針釋放引發的錯誤 :釋放同一塊內存兩次,或釋放一塊不曾使用 malloc 分類的內存,或釋放一個無效的指針

GDB調試

g++編譯時加入-g選項指明在編譯的時候,產生調試信息。數據結構

g++ -g -std=c++11 3SumClosest.cpp -o 3SumClosest 指針

編譯完成後輸入調試

gdb 3SumClosestc++11

開始調試,code

首先輸入 run 運行整個程序圖片

輸入圖片說明

發現程序產生 received signal SIGSEGV, Segmentation fault 錯誤。內存

這時跟蹤錯誤,輸入get

backtrace(= bt)

輸入圖片說明

能夠得出錯誤出如今 3SumClosest.cpp:18,即第18行的錯誤。

查看詳情

frame 1

輸入圖片說明

這樣就定位到了問題。

class Solution
{
public:
	int twoSumClosest(vector<int>& nums, int start, int target)
	{
		int sum_min = 100000;
		for(int i=start+1; i++; i<nums.size()-1)
		{
			for(int j=i+1; j++; j<nums.size())
			{
				if( abs(nums[i] + nums[j] - target) < sum_min)
					sum_min = nums[i] + nums[j];
			}
		}

		return sum_min;
	}
}

問題具體是由於for語句循環條件寫反致使訪問越界了。

相關文章
相關標籤/搜索