Tem*_*mak 6 c++ stack-overflow visual-studio-2010 visual-c++
我正在使用VS 2010.
当我在调试模式下运行此程序时,它会抛出堆栈溢出异常,并在第99行的chkstk.asm文件中显示一个断行.
但是当我在Release模式下运行它时,它没问题.
此外,如果我将其中一个数组的大小减小到10000,它在Debug中运行良好.是什么原因?
#include <iostream>
using namespace std;
int main()
{
char w[1000001], temp[1000001];
cout<<"Why?"<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Ton*_*ion 12
因为堆栈非常小,在大多数系统上大约1MB,所以你的大缓冲区会溢出它.要解决这个问题,只需在堆上分配如下:
#include <iostream>
using namespace std;
int main()
{
char* w = new char[1000001];
char* temp = new char[1000001];
cout<<"Why?"<<endl;
delete[] w;
delete[] temp;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
堆栈非常小(约1MB).你正在用这些数组中的大量元素填充它.
如果您需要更多空间,请尝试在堆上分配(指针指向).
实现这一点的一个好方法是使用向量,它在内部将内容存储在堆上:
std::vector<char> w (1000001);
std::vector<char> temp (1000001);
Run Code Online (Sandbox Code Playgroud)
你在堆栈上分配了太多的东西; 可能在调试模式下,堆栈由于各种安全检查而占用更多,或者故意更小以帮助您更早地检测到此类问题.无论如何,使数组变得更大将导致堆栈溢出,即使在发布模式下(除非编译器完全优化它们).
问题的根源在于你不应该在堆栈上分配大量的东西,这在大小上是非常有限的(默认情况下在Windows上使用VC++为1 MB)并且应该仅用于小缓冲区/对象.如果你需要做大的分配,在堆上做(用new/ malloc),最好使用智能指针来避免内存泄漏.
| 归档时间: |
|
| 查看次数: |
3432 次 |
| 最近记录: |