2013-02-18 43 views
0

我有以下循环(这发生在类型SgApp 24级的对象的阵列与删除[]删除)析构函数调用中信号11的可能原因是什么?

0x086f5361 <+45>: cmp ebx,DWORD PTR [esi+0x4] 
    0x086f5364 <+48>: je  0x86f5375 <PSM::~PSM()+65> 
    0x086f5366 <+50>: sub ebx,0xd4 
    0x086f536c <+56>: mov eax,DWORD PTR [ebx] 
    0x086f536e <+58>: mov DWORD PTR [esp],ebx 
=> 0x086f5371 <+61>: call DWORD PTR [eax] 
    0x086f5373 <+63>: jmp 0x86f5361 <PSM::~PSM()+45> 

在此代码%EBX是作用像一个迭代%ESI点的开始数组和sizeof(SgApp)= 0xd4。在阵列开始时,前4个字节表示数字24. 行0x086f5371 <+61>: call DWORD PTR [eax]调用SgApp默认虚拟析构函数。

  1. 从这个代码据我所知,一个对象指向一个虚函数表和从V表指向析构函数的第一个DWORD的第一个DWORD。它是否正确?每次我有虚拟析构函数时都会发生这种情况?

  2. 在什么情况下,这个析构函数的调用会导致信号11 seg fault在这个确切的线0x086f5371 <+61>: call DWORD PTR [eax]?我的猜测是%eax指向的值在某个未分配区域,但是可能的原因是什么?此时我应该拥有所有24个SgApp类型的对象(它们是在构造器中创建的)。

我提到这个信号11只发生过一次,我得到的只是一个糟糕的核心转储。在正常情况下,这是不可重复的,所以我正在寻找每一个可能的解释,包括可能是一些硬件故障或一些异国情调。

+1

难道你不能显示实际的C++代码吗? – 2013-02-18 12:20:55

+0

@JoachimPileborg不幸的是我基本上在PSM构造函数中有'keys = new SgApp [24];'而在PSM析构函数中我有'delete [] keys;'。也没有PSM对象作为值传递。 – George 2013-02-18 12:31:02

+0

这可能是因为你删除了一个实际上不存在的对象,所以'this'在析构函数中很可能是空的或另一个无效的指针。 – 2013-02-18 12:34:35

回答

2

我会推测你没有遵循rule of three,你最终会得到两个或多个指向同一个动态分配数组的对象。当他们的析构函数被调用时,第二次调用将导致尝试delete [],这已经是delete[]版本。

+0

事实上,复制构造函数和赋值运算符没有实现(这不是我的设计,在代码中,所有参数都不是通过值传递的,而仅仅是指针),但这不是原因。如果在前4个字节之前被删除的'keys'不能代表24而是使用gcc编译器-1。编辑:我有一个核心转储,我可以打印一些值,包括数组的前4个字节。 – George 2013-02-18 12:48:38

相关问题