想想一个 C 函数,它返回的东西必须是free
d,例如 POSIX 的strdup()
。我想在 C++11 中使用该函数并避免任何泄漏的机会,这是正确的方法吗?
#include <memory>
#include <iostream>
#include <string.h>
int main() {
char const* t { "Hi stackoverflow!" };
std::unique_ptr<char, void(*)(void*)>
t_copy { strdup(t), std::free };
std::cout << t_copy.get() << " <- this is the copy!" <<std::endl;
}
假设这是有道理的,是否可以对非指针使用类似的模式?例如 POSIX 的函数open
返回一个int
?
您所拥有的极有可能在实践中发挥作用,但并不严格正确。您可以按如下方式使其更有可能工作:
std::unique_ptr<char, decltype(std::free) *>
t_copy { strdup(t), std::free };
原因是函数类型std::free
不保证是void(void*)
。当传递一个值时,它保证是可调用的void*
,在这种情况下返回void
,但至少有两种函数类型符合该规范:一种具有 C 链接,一种具有 C++ 链接。大多数编译器不会注意到这一点,但为了正确性,您应该避免对此做出假设。
然而,即便如此,这也不是严格正确的。正如 @PeterSom 在评论中指出的,C++ 允许实现,例如制作std::free
重载函数,在这种情况下你和我都使用std::free
会很含糊。这不是授予的特定权限std::free
,这是为几乎所有标准库函数授予的权限。为了避免这个问题,需要一个自定义函数或函子(如他的答案)。
假设这是有道理的,是否可以对非指针使用类似的模式?
不与unique_ptr
,这确实是指针特有的。但你可以创建自己的类,类似于unique_ptr
,但不对被包装的对象做出假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)