Lv.v

导航

另类分析SIGSEGV信号

     关于SIGSEGV信号的含义就不解释了。网络上有很多解释。

今天记录一下,自己遇到的一个问题,想了好几天都没想出来的。今天终于想到原因了。

过程描述:

    有个类 CBase,里面放了一个成员变量 DATA,这个成员变量是个 union结构。union结构里面数据长度不一样。

然后,我有个std::list链表。链表来存放这个CBase。CBase全部都是从网络上传送过来的。

接着,我按消息头的长度来分配堆,然后存放CBase。(错就错在这里)

最后,我把*pCBase push_back()到list链表里面。(此时,系统就可能会给程序发出SIGSEGV信号.)

 

     注意上面说的。有个 可能。  可能 就表示说了,你偶尔会遇到这个信号,偶尔2个小时都不会遇到这个信号。

随机出现的问题,很蛋疼!!!

现在来说说,为什么会有这个信号。(如果你已经知道,就略过了)

     根据消息头来分配长度在这里是不能保证能容纳 CBase的数据。当然,网络发送的数据肯定是正确的。然而在list保存到链表里面时,

list会按最大长度来保存数据。这个时候,你刚刚分配的长度不够最大长度时,就可能会出现SIGSEGV信号。再想想产生SIGSEGV的原因,就知道为什么

会产生这个错误了。

   其实就是类似数组越界,或者你访问了不该访问的地址。 写个简单的示例程序,以此警戒。

class ABC
{
public:
union
{
    int nnn;
    int sdf;
    char sadf;
    int sadfkasdf[5];
}_BCD;
};

int _tmain(int argc, _TCHAR* argv[])
{
ABC* pa ;
char* p = new char;//我只分配一个字节的长度来容纳ABC。你觉得可以吗?
p[0] = 'a';
pa = (ABC*)p;

vector<ABC> vr;
vr.push_back( *pa );//这里就可能会错误了。你访问的堆已经越界了。
//但是,系统不知道。只有在他很不爽的时候,就让你的程序突然崩溃。
//这个时候,你就很纳闷了。刚刚不是还运行的好好的吗

}

  

 

posted on 2015-05-29 15:17  Lv.v  阅读(1355)  评论(0编辑  收藏  举报