结构消耗过多的内存

时间:2019-01-02 11:07:59

标签: c++ struct

我正在做学校作业,处理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的空间来处理大量数据。

虽然不知道这是否成立,因为从我在线阅读的内容来看,堆栈和堆都可以分配变量,堆栈不仅仅为函数调用保留,而且还为这些函数内部的变量保留...

2 个答案:

答案 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}}}}}}}};

丑陋,您不知道要填充什么对象,但是应该可以在现代编译器上工作。