C++调试时抛出异常:VS无编译错误但调试运行失败求助
问题原因排查
你的代码存在多处数组越界、对象拷贝错误、野指针问题,直接导致运行时崩溃:
- Question构造函数数组越界+赋值逻辑错误
你定义的choices数组大小为3,C++数组下标从0开始,有效下标仅为0/1/2,你写的this->choices[3] = choices[3];首先访问了越界的非法内存,其次这行代码只能赋值越界位置的一个元素,3个选项根本没有被正确拷贝到类的成员变量中。 - Quizz构造函数参数逻辑错误+数组越界+野指针
- 你需要存储5道题,但构造函数只接收单个
Question对象,无法完成批量存储 - 成员变量
questions指针数组大小为5,有效下标仅为0~4,你写的this->questions[5] = &questions;属于越界写内存 - 你存储的是构造函数参数的地址,这个参数是函数局部临时变量,构造函数执行完毕后就会被销毁,后续访问这个地址就是访问野指针
- 你需要存储5道题,但构造函数只接收单个
- main函数实例化Quizz时数组越界
你定义的Question questions[5]数组大小为5,有效下标仅为0~4,你写的questions[5]访问了越界的非法内存,传入Quizz构造函数的是无效对象 - displayQuestion访问野指针
Quizz的questions指针数组的前5个元素从未被赋值,全是野指针,调用getQuestions()返回的是非法地址,访问->getText()自然触发异常。
修复代码
#include <iostream> #include <string> using namespace std; class Question { private: string text; string choices[3]; string answer; public: Question(string text, const string choices[3], string answer) { this->text = text; // 循环拷贝三个选项 for (int i = 0; i < 3; i++) { this->choices[i] = choices[i]; } this->answer = answer; } bool checkAnswer(string answer) { return this->answer == answer; } string getText() { return this->text; }; }; class Quizz { private: Question* questions[5]; int score = 0; int questionIdx = 0; public: // 修改构造函数,接收Question数组指针和数组大小 Quizz(Question questions[], int count) { // 把传入的五道题地址依次存入成员数组 for (int i = 0; i < count && i < 5; i++) { this->questions[i] = &questions[i]; } }; Question* getCurrentQuestion() { if (questionIdx < 0 || questionIdx >=5) return nullptr; return questions[questionIdx]; }; void displayQuestion() { Question* cur = getCurrentQuestion(); if (cur == nullptr) return; cout << questionIdx + 1 << " / " << 5 << " Question : " << cur->getText() << endl; }; }; int main() { const string cho[3] = { "Carl","Mike","Jason" }; Question q1 = {"Who has a dog?", cho, "Carl"}; Question q2 = { "Who has a cat", cho , "Mike" }; Question q3 = { "Who knows i have a cat ", cho , "Mike" }; Question q4 = { "Who knows i haven't got a dog", cho , "Carl" }; Question q5 = { "Who knows i live in LA", cho , "Jason" }; Question questions[5] = { q1,q2,q3,q4,q5 }; // 传入数组和大小 Quizz quiz(questions, 5); quiz.displayQuestion(); return 0; }
内容的提问来源于stack exchange,提问作者Emir
相关产品推荐
相关产品推荐

