为什么使用XXXX_new和XXXX_free而不是新的和删除?

时间:2016-04-25 20:27:45

标签: c++ libssh

在阅读libssh library时,我看到他们特意说

  

libssh遵循allocate-it-deallocate-it模式。必须使用xxxxx_free()

取消分配使用xxxxx_new()分配的每个对象

这是来自它的东西是C库而不是C ++库,其中new和delete不存在或者是忘记new和删除并使用xxxx_new手动创建和删除对象的常见做法和xxxx_free模式?如果通常的做法是什么,它比new和delete以及被调用的构造函数和析构函数有什么好处?

[编辑]在&#34; libssh库&#34;上添加了我作为<a>标签读取的地方的链接。对于那些提问。

2 个答案:

答案 0 :(得分:3)

乍一看您提供的链接显示libssh使用xxxx_new()函数作为组合的分配器/构造函数调用。它实际上只是工厂功能的标准命名。同样,xxxx_free()充当析构函数/解除分配器组合。

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

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

答案 1 :(得分:-1)

  

这是来自它的东西是C库而不是C ++库,其中new和delete不存在

最有可能是的。在c代码中,malloc()提供的普通内存分配通常需要进行更多的初始化。它与new调用class / struct个实例的构造函数类似。

  

或者通常的做法是忘记new并删除并使用xxxx_new和xxxx_free模式手动创建和删除对象?

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

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