关于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 );//这里就可能会错误了。你访问的堆已经越界了。
//但是,系统不知道。只有在他很不爽的时候,就让你的程序突然崩溃。
//这个时候,你就很纳闷了。刚刚不是还运行的好好的吗 }