【发布时间】:2018-01-02 15:03:20
【问题描述】:
这可能有点特定于实现,但其中一些似乎是基本的。
我确定我一定在标准库中遗漏了一些东西。
问题是这样的:
我想实现一个std::unique_ptr,它的删除器是free()
[因为值是通过malloc()分配的]
当然,有很多关于如何做到这一点的选择,但是 (至少在 x86-64 的 g++ 4.8.4 中)它们似乎具有不同的内存使用影响。
例如: 方法一:
std::unique_ptr<char, std::function<void(void*)>> ptr_a(malloc(10), free);
然而,
sizeof(ptr_a) == 40 字节(8 表示 void*,32 表示 std::function)
方法二:
std::unique_ptr<void, void (*)(void*)> ptr_b(malloc(10), free);
稍微好一点,因为
sizeof(ptr_b) == 16 个字节(8 个用于 void*,8 个用于裸函数指针])
方法三:
template <void (*T)(void*)>
class Caller {
public:
void operator()(void* arg) {
return T(arg);
}
};
std::unique_ptr<void, Caller<free>> ptr_c(malloc(10));`
此时,sizeof(ptr_c) == 8 字节(可能的最小值) - 但我必须引入一个几乎是纯样板的类(并且如图所示,易于模板化)。
这似乎是一个如此简单的模式 - STL 中是否有某些元素可以执行上述 Caller<> 的操作?
当然,在对普通类型调用 delete 时,默认情况下 g++ 确实确实显示为 free() - 但这似乎远不能由标准保证(如果没有别的,新/删除可能会从默认分配/释放重新定义函数,然后 default_delete 将调用替换删除)。
此外,还有其他情况,在纯 C 库中分配的某些对象的释放将通过简单的函数调用而不是删除器来实现。为了让 std::unique_ptr 正确有效地调用它们,必须将这样的分配/释放函数包装在类中似乎有些乏味 - 这让我觉得我错过了一些东西(大多数现代 C++ 规范的其余部分似乎是经过深思熟虑的)。
【问题讨论】:
标签: c++ c++11 memory-management stl