You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递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函数体都没进,所以优先查前两点。

总结排查步骤

  1. 单独测试new player(32,32),确认Player构造函数没问题;
  2. 确认hand指针是有效的,不是空指针也不是野指针;
  3. 如果还是有问题,用调试器打断点,跟踪程序执行到哪一步抛出错误,精准定位问题。

内容的提问来源于stack exchange,提问作者younlok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:57:00