调用运算符delete时的断言

Assertion when operator delete is called

本文关键字:断言 delete 运算符 调用      更新时间:2023-10-16

当我的对象被销毁时,我在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个线程在播放(每个线程有两个玩家,交替播放——玩家根据需要创建和销毁)。因此,在寻找解决方案但没有找到之后,我决定在应用程序执行期间保留这些对象。因此,现在我只有在关闭程序的调试版本时才能得到断言(而且在关闭发布版本时可能会出现不明显的崩溃,这从来都不是因为它应该全天候运行)。我只需要知道我做错了什么。任何帮助都将不胜感激。

m_pPlayer[0]是什么类型(如David所问。)它是CSocketPlayer的基本类型还是CSocketPlay本身?如果它是基类型,则需要使基类中的析构函数为虚拟的。这可能与你的问题有关。如果没有,那么问题一定是您已经删除了该对象。这可能是由于竞争条件造成的,其中2个线程使用相同的指针运行析构函数。也可能是new或delete操作符过载,例如从另一个堆进行分配。我想这太牵强了。。。。但有可能。。