搞定断错误(Segmentation faults)和两次释放内存的问题

我满怀信心的编写了链表函数,结果运行时得到了两个错误:

1.段错误(Segmentation faults)

  我当时编写了一个链表的排序函数如下:

  void Linkedlist::sort()
    //to sort the list
     {
          int data = 0;
   
          Node* p1 = head;
         Node* p2 = head;
   
         if(head != NULL)
          {
          //selection sort
           while(p2 -> next != NULL)
           {
             while(p1 != NULL)  
             {
              p1 = p1 -> next; //move p1 to next node  (问题就出现在这里,因为p1 -> next 可能是NULL
   
             //exchange two node’s data
               if(p1 -> data <= p2 -> data)
               {
                 data = p1 -> data;
                 p1 -> data = p2 -> data; 

                  p2 -> data = data;
             }
             }
   
             p2 = p2 -> next; //move p2 to the next node
             p1 = p2;
            }
          }
     }


当时我去google了一下,找到了很多的帖子,总结起来有一下的几个原因:

1。 针没有赋值;
2。 量赋值类型有错误。

3。数组越界也能产生断错误;

4。 最主要的错误就是声明了指针,但是没有初始化 ,结果再后来的时候进行间接引用 ,就出现问题了。


又找到了一个很好的英文网址:

http://en.wikipedia.org/wiki/Segmentation_fault   


我也感觉到我很大一部分原因出现在指针的操作上了,但是一直没有看出来,后来就不得不上csdn,终于在那些大牛人的帮助下搞定了,超级感谢他们。     

2.两次释放内存,出现:double free or corruption (fasttop): 0x0890e008   

*** glibc detected *** ./l1: double free or corruption (fasttop): 0x0890e008 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7d0ba00]
/lib/libc.so.6(cfree+0x89)[0xb7d0d6f9]
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6(_ZdlPv+0x21)[0xb7ebc1a1]
./l1(__gxx_personality_v0+0x279)[0x8048a01]
./l1(__gxx_personality_v0+0x29d)[0x8048a25]
./l1[0x8048e60]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7cbbfdc]
./l1(__gxx_personality_v0+0x59)[0x80487e1]

======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:03 1271041    /home/zhongyijun/Datastructures/list/stack/3.2/l1
0804a000-0804b000 r–p 00001000 08:03 1271041    /home/zhongyijun/Datastructures/list/stack/3.2/l1
0804b000-0804c000 rw-p 00002000 08:03 1271041    /home/zhongyijun/Datastructures/list/stack/3.2/l1
0890e000-0892f000 rw-p 0890e000 00:00 0          [heap]
b7b00000-b7b21000 rw-p b7b00000 00:00 0
b7b21000-b7c00000 —p b7b21000 00:00 0
b7ca5000-b7ca6000 rw-p b7ca5000 00:00 0
b7ca6000-b7dd0000 r-xp 00000000 08:03 2932840    /lib/libc-2.6.1.so
b7dd0000-b7dd2000 r–p 0012a000 08:03 2932840    /lib/libc-2.6.1.so
b7dd2000-b7dd3000 rw-p 0012c000 08:03 2932840    /lib/libc-2.6.1.so
b7dd3000-b7dd6000 rw-p b7dd3000 00:00 0
b7dd6000-b7de0000 r-xp 00000000 08:03 3228413    /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1
b7de0000-b7de1000 r–p 00009000 08:03 3228413    /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1
b7de1000-b7de2000 rw-p 0000a000 08:03 3228413    /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1
b7de2000-b7e06000 r-xp 00000000 08:03 2932821    /lib/libm-2.6.1.so
b7e06000-b7e07000 r–p 00023000 08:03 2932821    /lib/libm-2.6.1.so
b7e07000-b7e08000 rw-p 00024000 08:03 2932821    /lib/libm-2.6.1.so
b7e08000-b7ee6000 r-xp 00000000 08:03 3228412    /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6.0.8
b7ee6000-b7eea000 r–p 000dd000 08:03 3228412    /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6.0.8
b7eea000-b7eeb000 rw-p 000e1000 08:03 3228412    /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6.0.8
b7eeb000-b7ef2000 rw-p b7eeb000 00:00 0
b7eff000-b7f01000 rw-p b7eff000 00:00 0
b7f01000-b7f02000 r-xp b7f01000 00:00 0          [vdso]
b7f02000-b7f1c000 r-xp 00000000 08:03 2932839    /lib/ld-2.6.1.so
b7f1c000-b7f1d000 r–p 00019000 08:03 2932839    /lib/ld-2.6.1.so
b7f1d000-b7f1e000 rw-p 0001a000 08:03 2932839    /lib/ld-2.6.1.so
bfd08000-bfd1d000 rw-p bffeb000 00:00 0          [stack]
已放弃

又查了很多的帖子,调试了好几次程序,但是弄错了方向,我还以为是我的creat函数出错呢,还是没有找出来,不得不再次上csdn,在几个人的提醒下终于发现自己的析构函数有问题了,果真是释放了好几次内存: 

Linkedlist::~Linkedlist()
{
    deleteL();

void Linkedlist::deleteL()
//delete the linkedlist 
{
    Node* p1 = head;
    Node* p2 = head;

    if(head != NULL)
    {
        while(p1 != NULL)
        {
            p1 = p1 -> next; //move p1 to the next node 
            delete p2; //delete the previous node       (这里出现问题,因为p2没有继续移动) 
        }  
        head = NULL;
    }
}

哎,终于搞定了,学了不少,既学会了使用gdb,又长了见识~~


知识共享许可协议
本作品《搞定断错误(Segmentation faults)和两次释放内存的问题》verynix创作,采用知识共享署名-非商业性使用-禁止演绎 3.0 Unported许可协议进行许可。
基于verynix.com上的作品创作。
Permissions beyond the scope of this license may be available at verynix.com.

本文链接: http://verynix.com/1043.html

Post Footer automatically generated by wp-posturl plugin for wordpress.

Leave a Reply

Your email address will not be published. Required fields are marked *