我正在做学校作业,处理C ++中的Structs。该分配不允许使用STL或new
/ delete
。
我代表杂志上的物品。
struct PLACE {
int itemCount;
int etiquette[2];
};
struct SHELF {
int placesCount;
PLACE places[128];
};
struct RACK {
int shelvesCount;
SHELF shelves[128];
};
struct MAG {
int racksCount;
RACK racks[5];
};
现在,当我运行以下代码时,它可以正常工作,但是,如果我将racks数组的长度更改为20左右,则会出现运行时错误(code.exe停止工作)。
PLACE place1 = {1, {1,2}};
SHELF shelf1 = {2, {place1}};
RACK rack1 = {3, {shelf1}};
MAG mag1 = {1, {rack1}};
似乎我超出了某种记忆能力?我本来以为这不太可能,因为我在计算时(机架长度为5时)仅使用((((12 * 128)+ 4)* 128 + 4)* 5 + 4个字节,大约1MB。
EDIT:
我要求我的教练对此做一些澄清。他告诉我,有可能超出了我的 heap ,而不是 stack ,因为:(quote)
堆栈处理函数调用,超出堆栈可能是由于 例如递归,在这里我们要处理大数据,因此 而是堆被超出了。
他还告诉我,我的计算机可能只有较低的限制(大约4MB),而正在检查我们的代码的服务器已分配了1GB的空间来处理大量数据。
虽然不知道这是否成立,因为从我在线阅读的内容来看,堆栈和堆都可以分配变量,堆栈不仅仅为函数调用保留,而且还为这些函数内部的变量保留...
答案 0 :(得分:5)
您在此处使用了许多自动存储期限。您的编译器和体系结构不太可能允许此类内存超过1Mb。
幸运的是,解决方案很简单。
使用std::vector
代替数组:例如
struct MAG {
// int racksCount; no need for this if you use a std::vector
std::vector<RACK> racks;
};
,依此类推。 std::vector
将其大部分有效负载放入动态内存,这就是这种方法行之有效的原因。还有其他C ++标准库容器,但是一个很好的经验法则是使用std::vector
,除非您有充分的理由不这样做。
答案 1 :(得分:1)
是的,您的堆栈用完了。
这种情况尤其如此,因为您要从place1
中的shelf1
复制数据,并且对于所有其他对象来说都是相同的,所有这些仅针对一个元素。使用std::vector
而不是静态数组。
如果由于是一项任务而不能这样做,则仍然可以使用new
/ delete
来使用堆而不是堆栈。
如果没有,请用手指交叉,然后尝试使用:
MAG mag1 = {1, {{3, {{2, {{1, {1,2}}}}}}}};
丑陋,您不知道要填充什么对象,但是应该可以在现代编译器上工作。