shared_ptr陌生性,带有零值和自定义deleter
shared_ptr strangeness with null values and custom deleter
我们最近使用自定义deleter从solution_ptr移动到共享_ptr时遇到了崩溃。崩溃发生在用于创建智能指针的指针为无效时。以下是复制问题的代码,并显示了两个有效的情况。
在下面的来源中,一个和两个愉快地运行,而"释放"中的三起坠毁。当智能指针中使用的类具有虚拟"发行"时,崩溃似乎正在发生,因此该程序正在尝试查找V台。unique_ptr看起来像是检查无效指针,并且不运行驱动器。共享的指针似乎忽略了这一点。
有人知道这是通过设计而知道的,还是STL实现中的错误?我们正在使用Visual Studio2015。
#include <iostream>
#include <memory>
template<class R>
void ReleaseDestroy(R* r)
{
r->Release();
};
class FlatDestroy
{
public :
void Release()
{
delete this;
}
};
class VirtualDestroy
{
public:
virtual void Release()
{
delete this;
}
};
class SimpleOne
{
public :
};
void main()
{
std::shared_ptr<SimpleOne> One(nullptr);
std::shared_ptr<FlatDestroy> Two(nullptr, ReleaseDestroy<FlatDestroy>);
std::shared_ptr<VirtualDestroy> Three(nullptr, ReleaseDestroy<VirtualDestroy>);
One.reset();
Two.reset();
Three.reset();
}
unique_ptr
和shared_ptr
的破坏行为不同:
-
unique_ptr
仅在持有指针的情况下拨打deleter。 -
shared_ptr
总是调用deleter。
因此,您的共享指针deleter 必须能够处理空指针值!例如, std::free
很好,但是 std::fclose
却不是,您的deleter也不是(因为它无条件地删除了r
)。
顺便说一句,这是在LWG 2415中进行的,该问题涉及从独特的指针中构建共享指针,该指针在该缺陷分辨率之前被打破了,正是出于这个原因。(我自己在这里遇到了这个问题;请注意该代码如何小心以区分shared_ptr
的空案例。)
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- primr 5版.自定义deleter函数的unique_ptr构造函数
- shared_ptr陌生性,带有零值和自定义deleter
- 使用自定义deleter类型定义std::shared_ptr的别名
- 在shared_ptr中使用自定义的deleter
- std::unique_ptr的自定义deleter是手动调用析构函数的有效位置吗
- 使用std::shared_ptr将成员函数用作自定义deleter时出现问题
- 如何编写一个可以接受函数指针和/或函子的类,就像智能指针对自定义deleter所做的那样
- 使用unique_ptr和自定义deleter时感到困惑
- 用自定义deleter封装C型指针的常见方法
- 带有自定义deleter和分配器的shared_ptr
- 如何为包装需要2个参数的c函数的unique_ptr类成员创建自定义deleter
- 使用带有uniqueptr的自定义deleter
- 正在为共享指针调用自定义deleter类成员函数
- 将带有自定义deleter的unique_ptr移动到shared_ptr
- 自定义deleter以通过std::unique_ptr解除分配2D阵列
- C++11使用带有自定义deleter的unique_ptr
- 带有自定义deleter的Unique_ptr构造函数被删除