【发布时间】:2011-01-19 00:21:39
【问题描述】:
我一直在自学 C++0x 中的智能指针,但我遇到了一些让我感觉不一致的东西。具体来说,unique_ptr和shared_ptr的销毁策略是如何处理的。
对于 unique_ptr,您可以专门化 std::default_delete,从那时起,除非您明确请求不同的销毁策略,否则将使用新的默认值。
考虑以下几点:
struct some_c_type;
some_c_type *construct_some_c_type();
void destruct_some_c_type(some_c_type *);
namespace std {
template <> struct default_delete<some_c_type> {
void operator()(some_c_type *ptr) {
destruct_some_c_type(ptr);
}
};
}
现在,一旦到位,unique_ptr 将默认使用适当的销毁策略:
// Because of the specialization, this will use destruct_some_c_type
std::unique_ptr<some_c_type> var(construct_some_c_type());
现在将其与 shared_ptr 进行比较。使用 shared_ptr,您需要明确请求适当的销毁策略,否则默认使用 operator delete:
// error, will use operator delete
std::shared_ptr<some_c_type> var(construct_some_c_type());
// correct, must explicitly request the destruction policy
std::shared_ptr<some_c_type> var(construct_some_c_type(),
std::default_delete<some_c_type>());
两个问题。
- shared_ptr 需要在每次使用时指定销毁策略,或者我遗漏了什么,我是否正确?
- 如果我没有遗漏什么,知道为什么两者不同吗?
附:我关心这个的原因是我的公司做了很多混合 C 和 C++ 编程。 C++ 代码经常需要使用 C 风格的对象,因此指定不同的默认销毁策略的便利性对我来说非常重要。
【问题讨论】:
-
应该是
std::default_delete<some_c_type>()?顺便说一句,除非它在 C++0x 中得到修复并且我即将发现,否则所有这三个都是令人烦恼的。 -
@GMan - 谢谢,这是一个错字。为什么你认为它们都令人烦恼(我个人觉得 unique_ptr 的设计非常简洁)?
-
@RSamuel:我的意思是令人烦恼的解析;在 C++03 中,这些都是函数声明。
-
如果没有人回答这个问题,顺便说一句,我建议将其发布在 comp.lang.c++.moderated 上,我相信那里有人知道。如果你愿意,我会做的,我对此很好奇。
-
@GMan:在这种情况下,这确实更像是comp.std.c++的问题。这些都不是当前定义的 C++ 的一部分,至少对我来说,真正的问题是:“shared_ptr 之间的这种区别是无偿的还是有意的?”现在,它看起来可能是免费的,但是......