调用运算符delete时的断言
Assertion when operator delete is called
当我的对象被销毁时,我在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操作符过载,例如从另一个堆进行分配。我想这太牵强了。。。。但有可能。。
相关文章:
- 运算符C++ "delete []"仅删除 2 个前值
- g++用户定义的动态链接库上的全局new和delete运算符
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- C++ 使用增强正则表达式库时断言崩溃
- 为什么"delete"关键字不删除节点?
- "delete"在 C++ 中实际上做了什么?
- 析构函数和'delete'之间的区别
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何将向量断言到特征矩阵
- 如何知道何时调用删除以及何时调用 delete[] C++?
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 使用 Google Test 对自定义断言函数进行单元测试
- 断言"id < 0"在Qt ActiveX中失败
- 初始值设定项列表构造和静态断言
- 析构函数中的"delete this"
- 在delete()之后不会断言两个指针都指向NULL
- 调用运算符delete时的断言