即使将其分配给 NULL (C),指针也不是 NULL
Pointer not NULL even after assigning it to NULL (C)
我正在尝试释放两个二叉搜索树 (BST)。虽然两个 BST 都维护自己的节点,但它们包含的对象与我被告知以不同排序顺序维护两个 BST 的对象相同。这会导致双重释放情况,因为当我释放第二个 BST 时,对象仍然存在。我想之后将指针设置为 NULL,因为释放空指针是安全的。但是根据我的断点,进入第二次free call时指针不为NULL
这是我试图释放两组 BST 的函数。
void freeEmpDatabase(EmpDatabase database) {
freeTree(database.info->ssn_top);
freeTree(database.info->id_top);
free(database.info);
}
这是我释放单个树的函数。
void freeTree(BinaryTree * tree) {
if (tree != NULL) {
freeTree(tree->right);
free(tree->Object);
freeTree(tree->left);
tree->Object = NULL;
free(tree);
}
}
这是相关的结构。 (这是一项实验前作业,它让我按值传递“数据库”结构,因此传递了 EmpInfo 指针)。
typedef struct BinaryTree {
void * Object;
struct BinaryTree * left;
struct BinaryTree * right;
}BinaryTree;
typedef struct EmpInfo {
BinaryTree * ssn_top;
BinaryTree * id_top;
int size;
int error;
}EmpInfo;
typedef struct EmpDatabase {
EmpInfo * info;
}EmpDatabase;
如果有任何帮助,我将不胜感激。谢谢。
正如@Yunnosch 所解释的,尽管它们都指向同一个对象,但指针本身是副本。为了补救我的特定用例,我只是添加了一个布尔值来控制我是否需要释放对象指针:
void freeEmpDatabase(EmpDatabase database) {
freeTree(database.info->ssn_top, 1);
freeTree(database.info->id_top, 0);
free(database.info);
}
void freeTree(BinaryTree * tree, int freedObject) {
if (tree != NULL) {
freeTree(tree->right, freedObject);
if (freedObject == 1) {
free(tree->Object);
}
freeTree(tree->left, freedObject);
tree->Object = NULL;
free(tree);
}
}
我正在尝试释放两个二叉搜索树 (BST)。虽然两个 BST 都维护自己的节点,但它们包含的对象与我被告知以不同排序顺序维护两个 BST 的对象相同。这会导致双重释放情况,因为当我释放第二个 BST 时,对象仍然存在。我想之后将指针设置为 NULL,因为释放空指针是安全的。但是根据我的断点,进入第二次free call时指针不为NULL
这是我试图释放两组 BST 的函数。
void freeEmpDatabase(EmpDatabase database) {
freeTree(database.info->ssn_top);
freeTree(database.info->id_top);
free(database.info);
}
这是我释放单个树的函数。
void freeTree(BinaryTree * tree) {
if (tree != NULL) {
freeTree(tree->right);
free(tree->Object);
freeTree(tree->left);
tree->Object = NULL;
free(tree);
}
}
这是相关的结构。 (这是一项实验前作业,它让我按值传递“数据库”结构,因此传递了 EmpInfo 指针)。
typedef struct BinaryTree {
void * Object;
struct BinaryTree * left;
struct BinaryTree * right;
}BinaryTree;
typedef struct EmpInfo {
BinaryTree * ssn_top;
BinaryTree * id_top;
int size;
int error;
}EmpInfo;
typedef struct EmpDatabase {
EmpInfo * info;
}EmpDatabase;
如果有任何帮助,我将不胜感激。谢谢。
正如@Yunnosch 所解释的,尽管它们都指向同一个对象,但指针本身是副本。为了补救我的特定用例,我只是添加了一个布尔值来控制我是否需要释放对象指针:
void freeEmpDatabase(EmpDatabase database) {
freeTree(database.info->ssn_top, 1);
freeTree(database.info->id_top, 0);
free(database.info);
}
void freeTree(BinaryTree * tree, int freedObject) {
if (tree != NULL) {
freeTree(tree->right, freedObject);
if (freedObject == 1) {
free(tree->Object);
}
freeTree(tree->left, freedObject);
tree->Object = NULL;
free(tree);
}
}