使用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语句循环条件写反致使访问越界了。

相关文章
相关标签/搜索