Linux 下运行 C++ 程序出现 “段错误(核心已转储)”

时间:2021-10-27 07:51:40

Linux下写C++程序出现“段错误(核心已转储)”的问题:

段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。在编程中基本是是错误地使用指针引起的。

其中主要可能有以下几个方面的原因:

1.内存访问出错

这类问题的典型代表就是数组越界,访问到不属于你的内存区域 。

2.非法内存访问

出现这类问题主要是程序试图访问内核段内存而产生的错误。

3.栈溢出

Linux默认给一个进程分配的栈空间大小为8M。c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。因此如果你数组开的过大变会出现这种问题。

之前遇到过的问题原因是:在新建指针的时候没有初始化。如果要用指针,则在C中用 char *s=(char *)malloc(100*sizeof(char)) 为其分配内存空间,c++ 中用char *s=new char [100]。如果未分配内存空间,编译时不会检查出问题,但运行时可能会出现“段错误(核心已转储)” 错误。