C++代码出现写入内存违规错误,调用show()后闪退求助
内存写入违规与程序闪退问题的解决方案
我一眼就定位到了问题的核心——你的数组索引逻辑完全搞反了,这直接导致程序访问了未初始化的野指针,触发内存写入违规并闪退。下面给你详细分析和修复方案:
问题根源:错误的索引与计数顺序
你的count变量初始值是0,在添加第一个形状时,你先执行了count++(count变成1),然后把新创建的对象赋值给a[count]也就是a[1]。但在Show All的循环里,你是从x=0遍历到x<count(也就是x=0),这时候a[0]根本没有被赋值过,是一个随机的野指针,调用a[x]->show()自然会触发内存访问错误,直接导致程序崩溃。
分步修复方案
1. 修正数组索引与计数顺序
把count++放到对象赋值之后,确保每次都是先给当前count对应的数组位置赋值,再增加计数。比如添加形状的核心代码改成:
else if (user_choice == 1) { cout << "---===Menu===---" << endl; cout << "(1). Lingkaran" << endl; cout << "(2). Segitiga" << endl; cout << "(3). Back" << endl; cout << "Masukkan Pilihan Anda : "; cin >> pilihan; if (pilihan == 1) { int radius; cout << "Masukkan Radius : "; cin >> radius; a[count] = new lingkaran(radius); // 先给当前count位置赋值 count++; // 赋值完成后再增加计数 } else if (pilihan == 2) { int alas, tinggi; cout << "Masukkan Alas : "; cin >> alas; cout << "Masukkan Tinggi : "; cin >> tinggi; a[count] = new segitiga(alas, tinggi); count++; // 同样把count++移到赋值后 } else if (pilihan == 3) { break; } }
2. 确保基类show函数是虚函数
你用基类shape*的数组存储派生类对象,要让程序正确调用lingkaran和segitiga各自的show方法,必须在基类shape中把show声明为虚函数,否则会调用基类的show(如果基类没有实现,会导致未定义行为)。示例如下:
class shape { public: // 声明为纯虚函数,强制派生类实现自己的show方法 virtual void show() = 0; // 必须添加虚析构函数,避免释放派生类对象时的内存泄漏 virtual ~shape() {} };
3. 修正main函数的返回值
C++标准明确要求main函数必须返回int,不能用void main(),改成int main(),并在程序末尾添加return 0;,这不仅是规范,也能避免一些潜在的运行时问题。
4. 处理内存泄漏
程序结束前记得遍历数组,释放所有用new创建的对象,避免内存泄漏:
// 在while循环结束后添加 for (int x = 0; x < count; x++) { delete a[x]; }
修复后的Show All循环验证
修正索引后,show循环里的a[x]都是已经正确初始化的派生类对象指针,调用show()就不会再触发内存错误了:
else if (user_choice == 2) { for (int x = 0; x < count; x++) { cout << "test1" << endl; a[x]->show(); cout << "test2" << endl; cout << endl; } }
按照以上步骤修改后,你的程序应该就能正常运行,不会再出现内存违规和闪退的问题了。
内容的提问来源于stack exchange,提问作者EKA WIJAYA
相关产品推荐
相关产品推荐

