0x00363A09处的未处理异常,堆栈cookie检测代码检测到基于堆栈的缓冲区溢出

时间:2016-05-01 18:58:54

标签: c++

老实说,我无法告诉你这是怎么回事。我已经阅读了类似问题的线程,但是人们正在处理内存和事物的分配问题,而且到目前为止,作为一名程序员,我已经超出了我的范围,并且我的程序几乎没有这么复杂。

int main() {
double input[5] = { 5.0, 6.0, 8.0, 4.3, 5.6 };
GradeBook test(sizeof(input), input);


test.bubbleSort();
test.printAll();



return 0;
};

这些是我的私人数据成员

const static int gradeBookSize = 6;
int classSize;
double grades[gradeBookSize];
bool insertionSorted = false; //simply for efficency
bool bubbleSorted = false;

我的GradeBook类的构造函数

GradeBook(int inputSize, double inputGrades[]) {
    classSize = inputSize;
    for (int i = 0; i < classSize; i++) {
        grades[i] = (inputGrades[i]);
    }
    for (int i = classSize; i < sizeof(grades); i++) {
        grades[i] = 0;
    }

}

最后我在main()方法中实际使用了两种方法

void bubbleSort() {
    //sorts grades in descending order using bubblesort algorithm
    bool sorted = false;
    while (!sorted) {
        for (int i = 0; i < (sizeof(grades) - 1); i++) {
            if (grades[i] < grades[i + 1]) {
                double tmp = grades[i + 1];
                grades[i + 1] = grades[i];
                grades[i] = tmp;
            }
        }
        bool test = false;
        for (int i = 0; i < sizeof(grades) - 1; i++) {
            if (grades[i] < grades[i + 1]) test = true;
        }
        sorted = !test;
    }


    bubbleSorted = true;
    insertionSorted = false;
}

void printAll() {
    for (int i = 0; i < sizeof(grades); i++) {
        cout << grades[i] << "\t";
    }
    cout << endl;
}

在这里我们有我的调试输出,我不能做这个

的正面或反面
The thread 0x3378 has exited with code 0 (0x0).
Unhandled exception at 0x0130FC38 in CS260_Project4_James_Casimir.exe:0xC00001A5: An invalid exception handler routine has been detected (parameters: 0x00000003).

CS260_Project4_James_Casimir.exe has triggered a breakpoint.

Run-Time Check Failure #2 - Stack around the variable 'test' was corrupted.

Unhandled exception at 0x00363A09 in CS260_Project4_James_Casimir.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

Unhandled exception at 0x00363A09 in CS260_Project4_James_Casimir.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

Unhandled exception at 0x00363A09 in CS260_Project4_James_Casimir.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

The program '[7400] CS260_Project4_James_Casimir.exe' has exited with code 0 (0x0).

2 个答案:

答案 0 :(得分:1)

sizeof(x)会返回对象x字符的大小,而不是x是数组的元素数。

答案 1 :(得分:1)

主要问题是您未正确使用sizeofsizeof关键字返回类型包含的字节的数量,而不是数组中的项目数。

您的代码中发生了什么风,而不是数组中的项目数量,而您实际上正在使用(在grades数组的情况下)

sizeof(double)*6

很可能是48(数组中有6个项目,每个项目是8个字节)。问题显然是你的循环会迭代太多次,导致你的数组访问中的内存访问超出界限(正如你所看到的那样,崩溃)。

如果类型是数组,则使用grades的{​​{1}}数组中的项目数将为:

sizeof

所以它的字节数除以一个条目占用的字节数。

如果你想要比上面更直观的东西,那么使用sizeof(grades) / sizeof(grades[0])会给你这个:

std::array