尝试初始化矩阵C ++时出现错误的分配

时间:2018-03-31 18:50:43

标签: c++ matrix bad-alloc

我试图将2d矩阵放入AVL树中。但是我继续得到“在抛出bad_alloc实例后调用终止”。错误,然后程序崩溃。这是我的代码:

struct Node
{
  int key;
  struct Node *left;
  struct Node *right;
  int height;
  int **M;
};

struct Node* newNode(int key)
{
 struct Node* node = new struct Node;
 node->key   = key;
 node->left   = NULL;
 node->right  = NULL;
 node->height = 1;  

if(key == (0 % 3)){
    cout <<"Matrix" <<endl;
    int n = pow(2, 20);
    node->M = new int*[n];
    for (int i = 0; i < n; i++){
        node->M[i] = new int[n];
    }     
//  freemat(node, n);
}
 else if (key == (1 % 3)){
    cout <<"Matrix" <<endl;
    int n = pow(2, 19) + pow(2, 18);
    node->M = new int*[n];
    for (int i = 0; i < n; i++){
        node->M[i] = new int[n];
    }    
//  freemat(node, n);
}
else if(key == (2 % 3)){
    cout <<"Matrix" <<endl;
    int n = pow(2, 18) + pow(2, 17);
    node->M = new int*[n];
    for (int i = 0; i < n; i++){
        node->M[i] = new int[n];
    }   
  //    freemat(node, n);
  }
  return(node);
}

freemat是我创建的一个函数,用于释放矩阵,因为我认为这就是问题所在,但即使在“释放”矩阵之后我仍然遇到了问题。

int freemat(struct Node *N, int n){
  for(int i = 0; i < n; ++i)
    delete [] N->M[i];
  delete [] N->M;
}

程序编译,打印出单词“Matrix”,然后打印下面的错误。

2 个答案:

答案 0 :(得分:1)

bad_alloc通常来自你内存不足。您是否尝试在gdb下运行此操作以查看此操作? 2 ^ 20 * 2 ^ 20 * sizeof(int)大约是8 TB!

另外,一些未经请求的评论(随意忽略):看起来你是基于你的freemat函数以及如何初始化你的结构来自C背景。与C&C的malloc方法不同,后者在无法分配请求的内存时返回NULL,而C ++的新函数则抛出bad_alloc。

最后,检查(键==(1%3))没有意义。 1%3总是一个,所以除非您打算检查(键== 1),否则您可能需要(键%3 == 1)。

答案 1 :(得分:0)

这不是问题的答案 - 对不起,但评论的时间太长了。

摆脱所有分支的方法

static const powers[] = 
{
    1 << 20,
    1 << 19 + 1 << 18
    1 << 18
};

std::cout << "Matrix\n";

int n = powers[key % sizeof(powers)];
node->M = new int*[n];
for (int i = 0; i < n; ++i)
    node->M[i] = new int[n];

这仍然会分配大量的内存,但仍然会破坏你的计算机并使其熄火。