我试图将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”,然后打印下面的错误。
答案 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];
这仍然会分配大量的内存,但仍然会破坏你的计算机并使其熄火。