1

在阅读libssh 库时,我看到他们特别说

libssh 遵循 allocate-it-deallocate-it 模式。使用 xxxxx_new() 分配的每个对象都必须使用 xxxxx_free() 释放

这是因为它是一个 C 库而不是一个不存在 new 和 delete 的 C++ 库,还是忘记 new 和 delete 并使用 xxxx_new 和 xxxx_free 模式手动创建和删除对象是一种常见的做法?如果这是一种常见做法,那么它比 new 和 delete 以及被调用的构造函数和析构函数有什么好处?

<a>[编辑]为那些询问的人添加了我在“libssh 库”上将其作为标签阅读的链接。

4

2 回答 2

3

乍一看您提供的链接,您会发现该链接libssh将这些xxxx_new()函数用作组合的分配器/构造器调用。它实际上只是工厂函数的标准命名。同样,xxxx_free()充当析构器/释放器组合。

每当库想要为其用户代码提供类型安全的不透明指针时,将分配和构造组合到一个函数调用中是一个好主意:要编译用户代码,编译器只需要知道该类型存在并且它不同于任何其他类型类型。无需在公共标头中包含完整的class/struct声明。

这种方法在 C++ 库中不是很流行,因为它们通常希望他们的对象表现得像任何普通的 C++ 对象(这意味着指针/引用不能对编译器不透明)。但是如果一个库提供了一个 C 接口,这样的工厂函数就不太可能因为用户传递指向未初始化对象的指针(忘记构造函数调用)或搞砸对象的分配而出现奇怪的错误。

于 2016-04-25T20:57:10.320 回答
-1

这是因为它是一个 C 库而不是一个不存在 new 和 delete 的 C++ 库吗?

很可能是的。malloc()与c 代码中可用的普通内存分配相比,通常需要完成更多的初始化。它类似于创建的/实例的new调用构造函数。classstruct

还是忘记 new 和 delete 并使用 xxxx_new 和 xxxx_free 模式手动创建和删除对象是一种常见的做法?

不,这在 C++ 中并不常见。

处理动态分配的实例和所有权的方法是使用标准 c++动态内存管理实用程序中的函数和智能指针类。

于 2016-04-25T20:32:15.330 回答