您能帮助我理解为什么此代码会随机导致内存访问冲突吗?目标是从排序列表生成二叉搜索树。
单步执行代码我注意到当返回对fromSortedArray()
函数的递归调用时#include <iostream>
using namespace std;
class BST{
private:
struct Node {
int val;
struct Node *left, *right;
} *root;
public:
BST(){
this->root = NULL;
}
struct Node * fromSortedArray(int data[], int left, int right){
if(left>right) return NULL;
int m = left+(right -left)/2;
struct Node *node = (struct Node *) malloc(sizeof(struct Node*));
node->val = data[m];
node->left = this->fromSortedArray(data, left, m-1);
node->right = this->fromSortedArray(data, m+1, right);
return node;
}
void fromSortedArray(int data[], int n){
this->root = fromSortedArray(data, 0, n-1);
}
void deleteTree(struct Node *root){
if(root==NULL) return;
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
void deleteTree(){
this->deleteTree(this->root);
}
void traverse(struct Node *root){
if(root == NULL) return;
if(root->left!=NULL)traverse(root->left);
printf("%d ", root->val);
if(root->right!=NULL)traverse(root->right);
}
void traverse(){
this->traverse(this->root);
}
~BST(){
deleteTree();
}
};
int main(int argc, char * argv[]){
BST tree;
int data[] = {2,3,5,6,7,9};
tree.fromSortedArray(data, 6);
tree.traverse();
cout << "\n";
return 0;
}
指针随机变化的行为。为了给你一个上下文,我正在使用XCODE编译这个应用程序。
spark.udf.register("uuid", ()=>java.util.UUID.randomUUID.toString)
答案 0 :(得分:2)
我认为这一行是错误的。 struct Node * node =(struct Node *)malloc(sizeof(struct Node *));
应该是 sizeof(struct Node)因为你想为Node而不是Node *
应用内存答案 1 :(得分:1)
malloc
正在malloc
。一个人无法合并delete
和malloc
。 free
必须与new
匹配,delete
必须与malloc
匹配。
避免使用malloc
。它可以获得内存字节,仅此而且,您可以轻松地错误计算所需的字节数。 new
只应在罕见的边缘情况下用于C ++。更多关于该主题的阅读:
使用malloc
代替new
,如果可能的话,也不要使用std::unique_ptr
。改为使用自动变量,库容器或智能指针。
这是一个树结构,并且在这里意见,只要你观察In what cases do I use malloc vs new?你可以使用原始的,愚蠢的指针逃脱,因为它是树结构处理节点管理的工作。也就是说,当你有机会时,请与std::make_unique
和struct Node *node = (struct Node *) malloc(sizeof(struct Node*));
玩一下。它们可以让您的生活更轻松。
暂时坚持使用原始指针,替换
Node *node = new Node;
带
{{1}}