删除cout<<""<<endl;语句后出现Bus error:10报错如何解决
问题本质
你遇到的Bus error:10崩溃和删除cout<<""<<endl;没有直接关联,是代码本身存在大量内存非法访问的未定义行为,cout语句的存在只是刚好改变了程序运行时的内存布局,暂时掩盖了非法访问的崩溃表现,删除后触发崩溃是必然结果。
具体错误点
rotate函数内的指针r未分配内存就直接写入,属于野指针越界写:
需要先根据输入字符串长度申请内存,要多留1字节存储字符串结束符\0:char* r = new char[strlen(a) + 1];Crypt函数内所有动态内存分配逻辑完全错误:
所有指针在定义后未初始化就调用strlen读取长度,读取的是野地址的随机值,分配的内存大小完全不符合预期;且后续你直接将这些指针重新赋值为字符串字面量,此前申请的内存直接泄漏,字符串字面量位于只读内存段,后续修改也会触发非法访问。- 内层循环条件书写错误:
for (int c = 0; i < int(strlen(a)); c++)条件误写为i < strlen(a),会导致无限循环或数组越界,应该改为c < strlen(a)。 - 字符串字面量的类型为
const char*,赋值给非const的char*属于非法类型转换,会触发未定义行为。 - 所有
new申请的内存没有对应的delete释放,存在严重内存泄漏。
修复后代码
#include <iostream> #include <cstring> using namespace std; char* rotate(char const* a, int b) { int len = strlen(a); // 先申请足够的内存 char* r = new char[len + 1]; // 统一处理偏移量异常情况 b = b % len; if (b < 0) b += len; for (int i = 0; i < len; i++) { if (i >= len - b) { r[i] = a[i - (len - b)]; } else { r[i] = a[i + b]; } } r[len] = '\0'; return r; } char* Crypt(const char* Input, bool Encrypt, int InitialRotation, int Rotation) { const char* Table = "JPGVOUMFYQBENHZRDKASXLICTW"; const char* a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int inputLen = strlen(Input); // 提前申请结果所需内存 char* Result = new char[inputLen + 1]; int Offset = InitialRotation; int b; for (int i = 0; i < inputLen; i++) { // 修正循环条件 for (int c = 0; c < strlen(a); c++) { if (a[c] == Input[i]) { b = c; break; } } char* rotatedTable = rotate(Table, Offset); Result[i] = rotatedTable[b]; // 释放临时申请的内存避免泄漏 delete[] rotatedTable; Offset = Offset + Rotation; } Result[inputLen] = '\0'; return Result; } int main() { const char* A = "ZZZZ"; char* res = Crypt(A, 1, 1, 4); cout << res << endl; // 释放结果内存 delete[] res; return 0; }
内容的提问来源于stack exchange,提问作者Andrii Kovach
相关产品推荐
相关产品推荐

