Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用XXXX_new和XXXX_free而不是new和delete?_C++_Libssh - Fatal编程技术网

C++ 为什么使用XXXX_new和XXXX_free而不是new和delete?

C++ 为什么使用XXXX_new和XXXX_free而不是new和delete?,c++,libssh,C++,Libssh,当我读到这本书时,我看到他们特别说 libssh遵循allocate-it-deallocate-it模式。必须使用xxxxx\u free()释放使用xxxxx\u new()分配的每个对象 是不是来自C++库,而不是新的和删除的C++库,还是忘记使用XXXXY新的XXXXXY免费模式来新建和删除和手动创建和删除对象?如果这是一种常见的做法,那么与new和delete以及调用的构造函数和析构函数相比,它有什么好处 [编辑]添加了我在“libssh library”上读到的链接,作为询问者的标记

当我读到这本书时,我看到他们特别说

libssh遵循allocate-it-deallocate-it模式。必须使用xxxxx\u free()释放使用xxxxx\u new()分配的每个对象

是不是来自C++库,而不是新的和删除的C++库,还是忘记使用XXXXY新的XXXXXY免费模式来新建和删除和手动创建和删除对象?如果这是一种常见的做法,那么与new和delete以及调用的构造函数和析构函数相比,它有什么好处

[编辑]添加了我在“libssh library”上读到的链接,作为询问者的
标记

< P>这是来自C库而不是C++库的新的和删除不存在的< /P> 很可能是的。c代码中的
malloc()
通常需要比普通内存分配更多的初始化。它类似于
new
调用创建的
class
/
struct
实例的构造函数

或者忘记新建和删除,使用xxxx_新建和xxxx_自由模式手动创建和删除对象是一种常见做法

不,这在C++中不是常见的做法。


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

< P>第一次查看您提供的链接,发现 LBSSH 使用<代码> XXXXION NEUR()/代码>函数作为组合的分配器/构造函数调用。它实际上只是工厂函数的标准命名。类似地,
xxxx\u free()
充当析构函数/释放定位器的组合

每当库希望向其用户代码提供类型安全的不透明指针时,将分配和构造组合到单个函数调用中是一个好主意:要编译用户代码,编译器只需要知道该类型存在并且与任何其他类型不同。不需要在公共头中有完整的
/
结构
声明


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

您是否有链接到您读到的地方?除了C接口,主要区别在于它改变了控制对象创建的人——消费者和库。有了这个接口,库可以控制更多,这给了它更多的功能(例如,日志记录、断点、全局配置、避免不匹配的
new
delete
来自不同DLL的调用等)ssh_新对使用ssh_free、ssh_scp_新对使用ssh_scp_free、ssh_string_新对使用ssh_string_free、,ssh\u事件\u新对,ssh\u事件\u空闲。分别为会话、scp、字符串和事件对象分配和释放函数,它隔离了分配器和对象实现细节。C++新的和删除操作在C库中是不有用的。所以如果有人写这个库的C++版本(或者至少一个包),坚持函数调用约定还是使用传统的C++新的和删除以及适当的构造函数和析构函数是有意义的?