C++11 C++;-如果内部变量超过~60000,则完全跳过函数

C++11 C++;-如果内部变量超过~60000,则完全跳过函数,c++11,C++11,我为一个类编写了以下内容,但在测试时遇到了一些奇怪的行为arrayProcedure是指基于函数顶部的2个“调整”(arrSize,和start)对数组执行操作。对于分配,arrSize必须为10000,并且start必须为100。只是为了好玩,我决定看看如果我增加它们会发生什么,出于某种原因,如果arrSize超过60000左右(我还没有找到确切的限制),当使用调试器时,程序会立即崩溃并出现堆栈溢出: Unhandled exception at 0x008F6977 in TMA3Quest

我为一个类编写了以下内容,但在测试时遇到了一些奇怪的行为
arrayProcedure
是指基于函数顶部的2个“调整”(
arrSize
,和
start
)对数组执行操作。对于分配,
arrSize
必须为10000,并且
start
必须为100。只是为了好玩,我决定看看如果我增加它们会发生什么,出于某种原因,如果
arrSize
超过60000左右(我还没有找到确切的限制),当使用调试器时,程序会立即崩溃并出现堆栈溢出:

Unhandled exception at 0x008F6977 in TMA3Question1.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00A32000).
如果我只是在没有调试器的情况下运行它,我不会得到任何有用的错误;windows挂起了几分之一秒,然后给我一个错误
TMA3Question1.exe已停止工作

我决定试着调试一下,但这并没有说明什么。我在调用
arrayProcedure
的上方和下方放置了中断符,并在其内部插入了中断符。当
arrSize
不超过60000时,它运行正常:它在调用
arrayProcedure
之前暂停,在其内部的所有点正确等待,然后在调用下面的中断处暂停

但是,如果我提高
arrSize
,则在调用发生之前中断,但它似乎从未进入
arrayProcedure
;它会立即给我一个堆栈溢出,而不会在任何内部断点处暂停

我能想到的唯一一件事是生成的数组超出了计算机的当前内存,但这似乎不太可能,原因有两个:

  • 它应仅使用略低于1兆字节的数据:

    • sizeof(双)=8字节
    • 8*60000=每个阵列480000字节
    • 两个阵列的480000*2=960000字节
  • 据我所知,数组不是在输入I函数时立即构造的;它们是按定义分配的。在声明数组之前,我放置了几个断点,但从未到达这些断点

  • 如果您能对此有所了解,我们将不胜感激

    守则:

    #include <iostream>
    #include <ctime>
    
    //CLOCKS_PER_SEC is a macro supplied by ctime
    double msBetween(clock_t startTime, clock_t endTime) {
        return endTime - startTime / (CLOCKS_PER_SEC * 1000.0);
    }
    
    void initArr(double arr[], int start, int length, int step) {
        for (int i = 0, j = start; i < length; i++, j += step) {
            arr[i] = j;
        }
    }
    
    //The function we're going to inline in the next question
    void helper(double a1, double a2) {
        std::cout << a1 << " * " << a2 << " = " << a1 * a2 << std::endl;
    }
    
    
    void arrayProcedure() {
        const int arrSize = 70000;
        const int start = 1000000;
    
        std::cout << "Checking..." << std::endl;
        if (arrSize > INT_MAX) {
            std::cout << "Given arrSize is too high and exceeds the INT_MAX of: " << INT_MAX << std::endl;
            return;
        }
    
        double arr1[arrSize];
        double arr2[arrSize];
    
        initArr(arr1, start, arrSize, 1);
        initArr(arr2, arrSize + start - 1, arrSize, -1);
    
        for (int i = 0; i < arrSize; i++) {
            helper(arr1[i], arr2[i]);
        }
    }
    
    int main(int argc, char* argv[]) {
        using namespace std;
    
        const clock_t startTime = clock();
    
        arrayProcedure();
    
        clock_t endTime = clock();
        cout << endTime << endl;
        double elapsedTime = msBetween(startTime, endTime);
    
        cout << "\n\n" << elapsedTime << " milliseconds. ("
            << elapsedTime / 60000 << " minutes)\n";
    }
    
    #包括
    #包括
    //时钟每秒是ctime提供的宏
    双msb中间(时钟开始时间、时钟结束时间){
    返回结束时间-开始时间/(每秒时钟数*1000.0);
    }
    void initArr(双arr[],int start,int length,int step){
    对于(int i=0,j=start;istd::coutVisual Studio的默认堆栈大小为1MB

    您可以增加堆栈大小或使用新运算符

    double *arr1 = new double[arrSize];
    double *arr2 = new double[arrSize];
    ...
    delete [] arr1;
    delete [] arr2;
    

    Visual Studio的默认堆栈大小为1 MB

    您可以增加堆栈大小或使用新运算符

    double *arr1 = new double[arrSize];
    double *arr2 = new double[arrSize];
    ...
    delete [] arr1;
    delete [] arr2;
    


    测试
    if(一些变量>最大值)
    应该会让你立即产生怀疑。你怎么想象这种情况会是
    真的
    ?仔细想想
    INT\u MAX
    的意思。它实际上只是一个堆栈溢出。如果你使用更高的默认堆栈大小运行它,程序运行就很好。我只是尝试从bei中释放太高的值ng输入了,但它不起作用。但是,如果我取出它,同样的行为也会发生。@DAhrens情况如何?我甚至没有使用太多内存。另外,你忘了包含限制。h以获得INT_MAX值。测试
    If(some_INT_var>INT_MAX)
    应该会让你立即产生怀疑。你怎么想象这种情况会是
    真的
    ?仔细想想
    INT\u MAX
    的意思。它实际上只是一个堆栈溢出。如果你使用更高的默认堆栈大小运行它,程序运行就很好。我只是尝试从bei中释放太高的值ng进入,但它不起作用。但是,如果我取出它,同样的行为也会发生。@DAhrens情况如何?我甚至没有使用太多内存。此外,你忘了包括限制。h的INT_MAX值。哇。1mb看起来很小。谢谢。为什么它会立即崩溃?我在第2点的假设是否不正确?“使用
    新的
    运算符”–不,真的不。改用
    std::vector
    。@carcigenitate 1 MB堆栈大小对于正常应用来说已经足够了。@Konrad我必须使用数组进行赋值。为什么不使用
    new
    ?因为裸
    new
    不受RAII控制是一种不好的做法?@Konrad,我仍然很好奇为什么它会立即被cra控制她,而不是在它击中双arr1[arrsize]时崩溃
    。编译器让它在开始时进行分配是出于某种原因吗?@Carcigenicate是的,bare
    new
    s正是因为这个原因不好。如果是为了分配,请忽略我说的。至于为什么它会立即崩溃,堆栈分配通常在函数输入时处理,而不是在声明语句输入时处理达到(声明实际上从未在运行时执行,它们只是编译器的语句,以保留必要的空间和符号;唯一要执行的是初始化)。哇。1mb看起来真的很小。谢谢。为什么它会立即崩溃?我在第2点的假设不正确吗?“使用
    新的
    运算符”–不,真的不。改用
    std::vector
    。@carcigenitate 1 MB堆栈大小对于正常应用来说已经足够了。@Konrad我必须使用数组进行赋值。为什么不使用
    new
    ?因为裸
    new
    不受RAII控制是一种不好的做法?@Konrad,我仍然很好奇为什么它会立即被cra控制她,而不是在遇到
    double arr1[arrsize]
    时崩溃。编译器在开始时分配它是出于某种原因吗?@Carcigenicate是的,bare
    new
    s正是因为这个原因不好。如果是为了一个assig