将此指针作为weak_ptr传递给内部类
Passing this pointer to inner class as a weak_ptr
我正在尝试在代码中使用shared_ptr和weak_ptr的方法。我有两个班——一班和二班。一个内部类中的两个。类二的构造函数接收类一的weak_ptr,如下所示,并将其存储以备将来使用。
Class One
{
Class Two
{
private:
std::weak_ptr<One> m_wptrOne;
public:
Two(std::weak_ptr<One> wptrOne)
{
m_wptrOne = wptrOne;
/* m_wptr is used later by class Two if not expired and valid ofcourse */
}
}; // End Class Two
.....
void foo()
{
std::shared_ptr sptrOne(this);
Two obj(sptrOne);
.... /* do my work */
} // Program crashes when foo terminates
}; //End Class One
当我的函数foo返回时,我会崩溃,因为我认为"sptr"试图释放"this"指针,认为它是它的唯一所有者。
我该如何解决这个问题?或者我的程序在体系结构上不正确?任何建议都将不胜感激。
谢谢,
Tushar
我不想强制我的库用户在堆上创建对象作为共享指针。
那么您的内部类不能需要weak_ptr
。使用weak_ptr
需要使用shared_ptr
;它依赖于CCD_ 4创建的机制来知道指针何时被破坏。因此,如果您不希望用户必须使用shared_ptr
,则不能执行任何期望类封装在shared_ptr
中的操作。比如从中创建一个weak_ptr
。
因此,如果希望用户不在堆上创建这些对象,则需要使内部类独立于weak_ptr
。
您可以尝试强制用户将其堆栈对象包装在使用特殊deleter的shared_ptr
中。但这远比堆分配要麻烦得多。
下面是使用enable_shared_from_this
从this
传递弱所有权语义的示例。
请注意,对于具有自动存储持续时间的对象,不可能表达弱所有权语义。
您提到的关于shared_from_this
的崩溃可能是std::bad_weak_ptr
类型的异常,原因是试图从未共享的对象获取shared_ptr。
#include <memory>
class One : public std::enable_shared_from_this<One>
{
public:
class Two
{
private:
std::weak_ptr<One> m_wptrOne;
public:
Two(std::weak_ptr<One> wptrOne)
{
m_wptrOne = wptrOne;
/* m_wptr is used later by class Two if not expired and valid ofcourse */
}
}; // End Class Two
//.....
void foo()
{
std::shared_ptr<One> sptrOne = shared_from_this();
Two obj(sptrOne);
//.... /* do my work */
} // Program crashes when foo terminates
}; //End Class One
int main()
{
auto one = std::make_shared<One>();
one->foo();
}
相关文章:
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 从内部类继承
- 如何将枚举类转发声明为模板化类的内部类?
- 从内部类中的方法从包含类调用方法
- 从模板化父类中的派生内部类访问受保护的成员变量
- C++模板类的内部类访问
- 使用类模板的内部类模板专用化模板
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- C++ 如何在外部类中声明的内部类中使用变量
- 在C++中将内部类实现为具有名称空间的独立类有什么好处
- 参数化类的别名(或类型定义)内部类
- 从内部类的析构函数调用虚拟函数
- 如何在没有setter的情况下设置类内部类的成员变量?
- 具有相同名称的方法和内部类(错误:.. 与前面的声明冲突)
- 内部类私有成员访问和封闭的友好性
- 在C++中从内部类对象获取外部类对象
- 在它所属的模板类中使用内部类
- C++命名空间、内部类和运算符解析
- 从内部类访问外部公共成员