当前位置:   article > 正文

enabled_shared_from_this_fatal error in native method: processing of -javaa

fatal error in native method: processing of -javaagent failed, processjavast
  1. #include<boost/enable_shared_from_this.hpp>
  2. //获得指向this的shared_ptr
  3. /*
  4. weak_ptr的一个重要用途是用来获得this的shared_ptr,使对象自己能够生产shared_ptr管理自己:
  5. */
  6. /*
  7. 这个解决方案被实现为一个惯用法,在头文件<boost/enable_shared_from_this>中定义了一个助手类enable_shared_from_this<T>
  8. 使用的时候只需要让想被shared_ptr管理的类从它继承即可
  9. 需求: 在类的内部需要自身的shared_ptr 而不是this裸指针
  10. 场景: 在类中发起一个异步操作, callback回来要保证发起操作的对象仍然有效.
  11. 作者:尤不二
  12. 链接:http://www.zhihu.com/question/30957800/answer/50181754
  13. 来源:知乎
  14. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  15. struct A {
  16. void func() {
  17. // only have "this" ptr ?
  18. }
  19. };
  20. int main() {
  21. A* a;
  22. std::shared_ptr<A> sp_a(a);
  23. }
  24. 当A* a被shared_ptr托管的时候,如何在func获取自身的shared_ptr成了问题.
  25. 如果写成:
  26. void func() {
  27. std::shared_ptr<A> local_sp_a(this);
  28. // do something with local_sp_a
  29. }
  30. 又用a新生成了一个shared_ptr: local_sp_a, 这个在生命周期结束的时候可能将a直接释放掉.
  31. 这里就需要用enable_shared_from_this改写:
  32. struct A : public enable_shared_from_this {
  33. void func() {
  34. std::shared_ptr<A> local_sp_a = shared_from_this();
  35. // do something with local_sp
  36. }
  37. };
  38. shared_from_this会从weak_ptr安全的生成一个自身的shared_ptr.
  39. */
  40. class self_shared :public enable_shared_from_this<self_shared> { //一个需要用shared_ptr自我管理的类
  41. public:
  42. self_shared(int n):x(n){}
  43. int x;
  44. void print() {
  45. std::cout << "self_shared:" << x << std::endl;
  46. }
  47. };
  48. void eg_shared_from_this() {
  49. shared_ptr<self_shared> sp = make_shared<self_shared>(10); //获取指向对象的shared_ptr指针
  50. std::cout << "use count:" << sp.use_count() << std::endl;
  51. sp->print();
  52. shared_ptr<self_shared> sp1 = sp->shared_from_this();
  53. std::cout << "use count:" << sp.use_count() << std::endl;
  54. shared_ptr<self_shared> sp2 = sp;
  55. std::cout << "use count:" << sp.use_count() << std::endl;
  56. sp2->x = 1000;
  57. sp2->print();
  58. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/136229
推荐阅读
  

闽ICP备14008679号