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
;它会立即给我一个堆栈溢出,而不会在任何内部断点处暂停
我能想到的唯一一件事是生成的数组超出了计算机的当前内存,但这似乎不太可能,原因有两个:
- sizeof(双)=8字节
- 8*60000=每个阵列480000字节
- 两个阵列的480000*2=960000字节
#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;i std::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是的,barenew
s正是因为这个原因不好。如果是为了分配,请忽略我说的。至于为什么它会立即崩溃,堆栈分配通常在函数输入时处理,而不是在声明语句输入时处理达到(声明实际上从未在运行时执行,它们只是编译器的语句,以保留必要的空间和符号;唯一要执行的是初始化)。哇。1mb看起来真的很小。谢谢。为什么它会立即崩溃?我在第2点的假设不正确吗?“使用新的运算符”–不,真的不。改用std::vector
。@carcigenitate 1 MB堆栈大小对于正常应用来说已经足够了。@Konrad我必须使用数组进行赋值。为什么不使用new
?因为裸new
不受RAII控制是一种不好的做法?@Konrad,我仍然很好奇为什么它会立即被cra控制她,而不是在遇到double arr1[arrsize]
时崩溃。编译器在开始时分配它是出于某种原因吗?@Carcigenicate是的,barenew
s正是因为这个原因不好。如果是为了一个assig