SIGSEGV段错误:解引用结构体公有指针报错,指针已指向有效值如何解决
问题根因及修复方案
1. 直接崩溃原因:非法的printf参数
你写的printf('0' + env.size() + "");是完全错误的用法:
""是C风格字符串字面量,本质为const char*类型的指针'0'是ASCII码为48的char类型,会被提升为int和env.size()相加,最终结果是给原字符串指针偏移了48 + env.size()的地址,该地址几乎都属于不可读的非法内存,直接触发段错误。- 你对崩溃位置的误判来源于printf的行缓冲机制:默认情况下printf只有遇到换行符才会把缓冲区内容输出到终端,所以你看不到
printf("3")的输出,误以为崩溃发生在解引用那行,实际代码已经执行到错误的printf行才触发崩溃。
修复方案:替换为合法的printf写法:
// 如果要打印size数值 printf("%zu\n", env.size()); // 如果确定size在0-9之间,要转成字符打印 printf("%c\n", '0' + env.size());
所有printf建议都加上换行符\n,避免缓冲区延迟输出干扰调试。
2. delete语法错误
main函数末尾的delete (world, renderer, atlas);使用了C++逗号表达式,只会取最后一个值作为操作数,也就是说你实际上只释放了atlas的内存,world和renderer都存在内存泄漏。
修复方案:分三次执行delete:
delete world; delete renderer; delete atlas;
3. 潜在多态对象切片问题
你用std::vector<BaseEntity>存储派生类Grass对象时,会发生对象切片:只会复制Grass中属于BaseEntity的成员,派生类自定义的成员、虚表指针都会被截断,后续访问派生类特有成员、调用虚函数都会触发异常。
修复方案:如果需要做多态存储,改为存储指针:
// 修改Chunk的environment定义 std::vector<std::unique_ptr<BaseEntity>>* environment; // 插入元素改为 environment->push_back(std::make_unique<Grass>());
内容的提问来源于stack exchange,提问作者Skye
相关产品推荐
相关产品推荐

