传递GameObject类对象参数时触发std::bad_alloc错误求助
解决
std::bad_alloc错误:传递GameObject指针时未进入函数体的问题 嘿,这个std::bad_alloc错误本质是内存分配失败,而且你说调用addObject时连函数体都没进,那问题肯定出在调用这个函数之前的步骤,大概率是new player(32,32)或者hand指针本身的问题。我给你梳理几个最常见的排查方向和解决方案:
1. 优先排查Player类的构造函数
你执行gameobject* pla = new player(32,32)时,会触发Player的构造函数。如果构造函数里有以下情况,会直接抛出bad_alloc,根本到不了addObject那一步:
- 栈上分配超大内存:比如在构造函数里写
int huge_arr[100000000];,栈空间本来就很小(通常几MB),这种超大数组会直接导致栈溢出,表现出来可能就是bad_alloc或者直接崩溃。 - 无限递归构造:比如Player构造函数里又创建了Player对象,或者间接调用了自身的构造函数,导致无限循环申请内存,最终耗尽内存触发错误。
- 大量堆内存申请:比如在构造函数里循环
new上千上万个对象,或者申请超大的堆内存块,超过了系统可用内存。
排查方法:
把new player(32,32)单独拿出来测试,比如:
// 单独测试Player的创建 gameobject* pla = new player(32,32); cout << "Player对象创建成功,地址:" << pla << endl;
如果这一步就报错,那直接去查Player构造函数的代码,把上面说的几种情况逐一排除。
2. 检查hand指针的有效性
如果Player对象能正常创建,那就要看hand指针是不是野指针/空指针:
- 如果
hand没有被正确初始化(比如没调用new创建对应的对象,或者已经被delete释放了),那执行hand->addObject(pla)时,本质是访问非法内存,这种未定义行为可能会表现为bad_alloc,也可能直接崩溃。
排查方法:
在调用addObject前加个简单的判断:
if (hand == nullptr) { cout << "警告:hand指针是空指针!" << endl; return; } // 再调用addObject hand->addObject(pla);
或者在调试器里查看hand的地址,确认它指向的是一个已经正确构造的对象。
3. 额外排查:hand对象的内存是否被篡改
如果上面两种情况都排除了,那可以检查下hand指向的对象是不是已经被析构,或者它的内存被其他代码篡改了(比如越界写数组覆盖了hand的成员)。不过这种情况概率较低,因为你说连addObject函数体都没进,所以优先查前两点。
总结排查步骤
- 单独测试
new player(32,32),确认Player构造函数没问题; - 确认
hand指针是有效的,不是空指针也不是野指针; - 如果还是有问题,用调试器打断点,跟踪程序执行到哪一步抛出错误,精准定位问题。
内容的提问来源于stack exchange,提问作者younlok
相关产品推荐
相关产品推荐

