我目前正在用 C 制作一个 RedBlackTree,但在为您的结构提供构造函数时,我仍然不明白哪个更好/更理想。
struct RedBlackTree* RedBlackTree_new()
{
struct RedBlackTree *tree = calloc(1, sizeof(struct RedBlackTree));
if (tree == NULL)
error(DS_MSG_OUT_OF_MEM);
return tree
}
Run Code Online (Sandbox Code Playgroud)
struct RedBlackTree RedBlackTree_new()
{
struct RedBlackTree tree;
tree.root = NULL;
tree.size = 0;
return tree;
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果我选择第二个选项,那么我必须不断地将它作为指针传递给我的函数&,据我所知,在我的程序结束之前我永远无法销毁它(有人可以验证这是否属实?)。例如,如果destroy我的 Tree有一个函数,RedBlackTree如果它们不是用malloc或创建的,我将无法释放从结构中分配的内存,calloc对吗?
同样在更一般的情况下,两者的优点和缺点是什么?我总是可以通过 using 从指针中检索数据,*并且我总是可以通过 using将我的数据转换为指针&,所以几乎感觉它们在某种意义上是完全可以互换的。
真正的区别在于对象的生命周期。通过动态分配(malloc/calloc和free)在堆上分配的对象会一直存在,直到它被显式释放。
相反,具有自动存储的对象(如您的第二个示例中)仅在声明它的范围内存活,并且必须复制到其他地方才能使其存活。
因此,这应该有助于您选择哪种更适合特定情况。
从效率的角度来看,动态分配更昂贵,需要额外的间接寻址,但允许您传递指针,从而防止数据被复制,因此在其他情况下可能更有效,例如。当对象很大并且副本会很昂贵时。