调用运算符删除时的断言

时间:2016-01-04 21:50:50

标签: c++ windows multithreading assertion

当我的对象被摧毁时,我不断收到断言 dbgheap.c第1399行

_ASSERTE(pHead->nBlockUse == nBlockUse);

我找不到任何理由发生这种情况。指针在构造函数中正确初始化为NULL:

CPlayThread()
{
  m_pPlayer[0]= NULL;
  m_pPlayer[1]= NULL;
};

这是实际创建对象的代码。

if(pParam->m_pPlayer[0] == NULL) //pParam is a CPlayThread*
{
    if(config.m_nPlayerMode == modeSocket)
      pParam->m_pPlayer[0]= new CSocketPlayer();
}

当线程被销毁时,对象会被破坏,这就是断言发生的地方。

~CPlayThread()
{
    if(m_pPlayer[0])
        delete m_pPlayer[0];
    m_pPlayer[0]=NULL;
    if(m_pPlayer[1])
        delete m_pPlayer[1];
    m_pPlayer[1]= NULL;
};

我在这里完全失败了。它过去工作正常,不知何故,它在连续运行三四天后开始在客户的位置崩溃。同时我的调试可执行文件开始断言每一个 单人一名球员被摧毁。在任何给定时间最多可以播放96个线程(每个线程有两个玩家,交替 - 根据需要创建和销毁玩家)。因此,在寻找解决方案而没有找到解决方案后,我决定在应用程序执行期间保留对象。所以现在我只是在关闭程序的调试版本时才得到断言(并且假设在关闭发行版本时出现了一个不明显的崩溃,这绝不是因为这应该全天候运行)。 我只需要知道我做错了什么。任何帮助都会受到欢迎。

1 个答案:

答案 0 :(得分:0)

什么类型是m_pPlayer [0](像大卫问的那样。)它是CSocketPlayer的基本类型还是CSocketPlayer本身。 ?如果它是基类型,则需要在基类中使析构函数为虚拟。这可能与您的问题有关。如果没有,那么问题必须是您已经删除了该对象。这可能是由于竞争条件造成的,其中2个线程使用相同的指针运行析构函数。 也可能是new或delete运算符被重载,例如从另一个堆分配。猜猜这很遥远......但可能......