新操作员无法分配内存

时间:2012-10-17 11:05:15

标签: c++

在我的C ++程序中,我需要处理大量信息。我将这些大信息存储在一个结构中。结构是......

struct xlsmain
{
    struct sub_parts_of_interface sub_parts[200];
    string name;
    int no_of_subparts;
};

struct sub_parts_of_interface
{
    struct pio_subparts pio[10];
    string name_of_interface;
    string direction; 
    string partition;
    int no_of_ports;
};

struct pio_subparts
{
    struct corners corner[32]; 
    string pio_name;     
};

struct corners
{
    struct file_structure merging_files[50];
    string corner_name;
    int merginf_files_num;
};

struct file_structure
{
    string file_name;
    string file_type;
    struct reportspecs report[20];
};

我正在使用new运算符为其分配内存

struct xlsmain *interface = new xlsmain[60];

在运行程序时显示std::bad_alloc error。请帮助!

3 个答案:

答案 0 :(得分:12)

您正在尝试分配60 xlsmain,其中包含12,000 sub_parts_of_interface,其中包含120,000 pio_subparts,其中包含3,840,000 corners,其中包含192,000,000 file_structure,其中包含3,840,000,000 reportspecs reportspecs {1}},您尚未显示std::vector的定义。所以你试图分配38亿的东西并且内存不足。

这是因为您运行的系统没有足够的内存来容纳您尝试分配的对象。

如果这些结构包含数组,因为结构可能包含这些对象,但它们通常不包含最大值,那么去除数组并替换它们std::vector(在C ++中)或指针(在C或C ++中) )。无论使用哪种方法,您都只需要空间用于所需的实际对象以及一些会计开销,而不是在理论上可以使用空间。 std::vector允许您根据需要添加元素,{{1}}应用程序将负责分配所需的内存。使用指针,您必须自己分配和释放空间。

答案 1 :(得分:1)

这很简单。你没有足够的记忆力。要么购买更多内存,要么重新设计代码。我建议用零长度向量替换你的数组。这样你只需要将矢量增长到你实际需要的大小,而不是总是固定大小。这将使用更少的内存并且也更灵活。例如

  struct pio_subparts
   {
    vector<corners> corner; 
    string pio_name;     
   };

如果不确切知道自己要做什么,就无法提出更准确的建议。

答案 2 :(得分:0)

@ H2CO3是对的。

在纯C中使用类似这样的东西: http://www.elook.org/programming/c/malloc.html