虚成员函数中boost::bind的奇怪行为
strange behavior with boost::bind in virtual member function
我有两个类,一个有虚函数
class OKClass
{
public:
void PrintTest() {
std::cout << "print from OK class " << std::endl;
}
};
class CrashClass
{
public:
virtual void PrintTest() {
std::cout << "print from virtual Crash class " << std::endl;
}
};
我把这两个类放在下面的测试代码中当调用func()时,CrashClass会崩溃OkClass打印单词"print from OK class",这是不应该的。因为shared_ptr测试在超出作用域时被释放。有人能给我解释一下为什么会发生这种奇怪的事情吗?
谢谢
boost::function0<void> func;
{
boost::shared_ptr<CrashClass> test(new CrashClass);
func = boost::bind(&CrashClass::PrintTest, boost::bind(&CrashClass::wptr::lock, CrashClass::wptr(test)));
}
func();
提示信息不足
typedef boost::weaked_ptr<CrashClass> wptr
我已经知道为什么第一个班可以工作,而第二个班却崩溃了
和我已经使用函子来解决这个问题
谢谢
在不知道wptr是什么的情况下,我只能猜测当测试超出范围时,CrashClass的实例正在被删除。如果是这种情况,您应该能够移除括号以防止碰撞。虽然"延迟"可能比"预防"更准确。"
boost::weak_ptr
不保证它所指向的内存会一直存在。这就是这门课的重点。weak_ptr
的持有者有责任锁定它(获得shared_ptr
),并在调用它之前测试指针。否则,您使用weak_ptr
错误。
相关文章:
- boost::bind()类似的东西,但用于函数调用
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 对函数库中的语法感到困惑 std::bind
- 如何将参数从函数传递给 std::bind
- 如何在C++中使用 std::bind 函数作为信号处理程序?
- std::bind() 参数列表中函子的执行顺序(可能与函数参数的求值顺序无关)
- 在模板函数参数中使用 std::bind
- boost::bind函数缓冲区的最大大小
- 使用 std::thread & std::bind 在成员函数中启动线程
- 如何使用 gtest 对 std::bind 函数进行单元测试
- 将boost::bind函数存储在std::map中
- bind函数的输入参数错误
- 无法在 std::map 中存储 boost::bind 函数
- 将boost::bind函数传递给内部类时出错