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

C++调试时抛出异常:VS无编译错误但调试运行失败求助

问题原因排查

你的代码存在多处数组越界、对象拷贝错误、野指针问题,直接导致运行时崩溃:

  • Question构造函数数组越界+赋值逻辑错误
    你定义的choices数组大小为3,C++数组下标从0开始,有效下标仅为0/1/2,你写的this->choices[3] = choices[3];首先访问了越界的非法内存,其次这行代码只能赋值越界位置的一个元素,3个选项根本没有被正确拷贝到类的成员变量中。
  • Quizz构造函数参数逻辑错误+数组越界+野指针
    1. 你需要存储5道题,但构造函数只接收单个Question对象,无法完成批量存储
    2. 成员变量questions指针数组大小为5,有效下标仅为0~4,你写的this->questions[5] = &questions;属于越界写内存
    3. 你存储的是构造函数参数的地址,这个参数是函数局部临时变量,构造函数执行完毕后就会被销毁,后续访问这个地址就是访问野指针
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:39:04