在阅读libssh library时,我看到他们特别说
这是因为它是C库而不是不存在new和delete的C++库吗?还是一种通常的做法是忘记了new和delete并使用xxxx_new和xxxx_free模式手动创建和删除对象?如果是通常的做法,那么与new和delete以及调用的构造函数和析构函数相比有什么好处?
[编辑]将链接添加到我在“libssh库”中作为<a>
标记阅读的位置,以供那些询问的人使用。
最佳答案
乍看之下,您提供的链接显示libssh
使用xxxx_new()
函数作为组合的分配器/构造函数调用。这实际上只是工厂功能的标准命名。同样,xxxx_free()
充当析构函数/解分配器组合。
每当库要为其用户代码提供类型安全的不透明指针时,将分配和构造合并为一个函数调用是一个好主意:要编译用户代码,编译器仅需要知道类型存在且与其他类型不同类型。不需要在公共(public) header 中包含完整的class
/ struct
声明。
这种方法在C++库中不是很流行,因为它们通常希望其对象的行为像任何普通的C++对象一样(这意味着指针/引用对编译器一定不能不透明)。但是,如果库提供C接口(interface),由于用户将指针传递给未初始化的对象(忘记了构造函数调用)或破坏了对象的分配,此类工厂函数就不太可能出现奇怪的错误。