我需要像这样创建一个数组
double grid [15000][40];
但Visual Studio 2012中的堆栈只有1MB。我怎样才能使用像这样或更大的变量? 这意味着如果我创建一个
std::vector<int>
我push_back 600 000次进入堆栈溢出?这似乎是一个很大的限制,怎么解决? 提前谢谢。
答案 0 :(得分:3)
大型对象应具有静态或动态存储持续时间。
<强>静态:强>
int a[1000000];
void f()
{
a[3] = 12; // fine
}
请注意对静态内存的共享,并发访问。
动态(但由合适的班级妥善管理):
void f()
{
std::vector<int> a(1000000); // dynamic objects managed by std::vector
a[3] = 12;
}
这里每个函数调用都会创建和管理自己的动态分配(并发性的复杂性被委托给内存分配器,所以你不必考虑那些)。
答案 1 :(得分:2)
这里没有问题。
这意味着如果我创建一个std :: vector并且我push_back 600 000次它会进入堆栈溢出?这似乎是一个很大的限制
不,因为矢量元素没有自动存储持续时间(它们不会“存在于堆栈中”)。他们不能。
怎么解决
没有什么可以解决的。向量元素是动态分配的。
答案 2 :(得分:0)
您可以将此数组定义为
static double grid [15000][40];
对于std::vector
,它为堆中的元素分配内存而不是堆栈。
答案 3 :(得分:0)
vector的内存是堆分配的,你不必担心堆栈。 您可以使用成员函数resize:
,而不是执行push_back std::vector<int> grid;
grid.resize(15000*40);
甚至更好,如果网格具有固定大小,您可以使用唯一指针
答案 4 :(得分:0)
如果您因任何原因不想使用std::vector
,可以选择另一种方法:
int main() { int (*grid)[40] = new int[15000][40]; // work with grid grid[0][0] = 0.0; grid[14999][39] = 42; delete [] grid; }
通常的警告适用于动态存储的原始指针,如果范围由异常终止,则会导致内存泄漏,因此delete
永远不会执行。