在阅读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),由于用户将指针传递给未初始化的对象(忘记了构造函数调用)或破坏了对象的分配,此类工厂函数就不太可能出现奇怪的错误。

10-05 19:20