找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 102|回复: 1

理解SOUI中对象的生命周期管理

[复制链接]
  • TA的每日心情
    郁闷
    2024-11-7 21:23
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    0

    回帖

    46

    积分

    新手上路

    积分
    46
    发表于 2024-11-6 17:24:36 | 显示全部楼层 |阅读模式
    看了老大的教程。https://www.cnblogs.com/setoutsoft/p/11693747.html

    1. bool SDemoSkin::SetImage(SStringW imgfile)
    2.     {
    3.         m_bIsColor = false;
    4.         m_FilePath = imgfile;
    5.         IBitmap *image = LOADIMAGE2(L"file:" + imgfile);
    6.         if (image)
    7.         {
    8.             SetImage(image);
    9.             //image->Release();
    10.             return true;
    11.         }
    12.         return false;
    13.     }
    复制代码

    比如以上的代码,云里雾里。花点时间,学习下。只给新手看的。高手就绕路吧,哈哈。写了一个demo验证一下。
    1. // autoRef_test.cpp : This file contains the 'main' function. Program execution begins and ends there.
    2. //

    3. #include <iostream>
    4. #include <type_traits>
    5. #include <interface\obj-ref-i.h>
    6. #include <helper/obj-ref-impl.hpp>
    7. using namespace SOUI;
    8. class MyClass : public TObjRefImpl<IObjRef> {
    9. public:
    10.     MyClass(int value) : value_(value) {
    11.         std::cout << "MyClass constructed with value: " << value_ << std::endl;
    12.     }
    13.     ~MyClass() {
    14.         std::cout << "MyClass destructed with value: " << value_ << std::endl;
    15.     }
    16.     int GetValue() const {
    17.         return value_;
    18.     }

    19. private:
    20.     int value_;
    21. };

    22. //c++ 11 new attach
    23. template <typename T, typename ... Args>
    24. void initAutoRefPtr(SAutoRefPtr<T>& autoRefPtr, Args && ... args) {
    25.     // 创建新对象
    26.     T* newObj = new T(std::forward<Args>(args)...);
    27.     autoRefPtr.Attach(newObj); // Attach没有额外调用AddRef,这里TObjRefImpl 内部的计数m_cRef初始就是1
    28. }

    29. int main()
    30. {
    31.     //SAutoRefPtr 的作用就是你 new的对象的生命周期可以交给它。自己不用再delete了

    32.     //SAutoRefPtr<MyClass> ptr1 = SAutoRefPtr<MyClass>(new MyClass(10));//不能这样写,因为会调用        SAutoRefPtr(T* lp) ,它会调用addRef。
    33.                                                                         //但是第一次创建TObjRefImpl的内部计数m_cRef初始为1,如果再调用addRe,
    34.                                                                         //m_cRef就会变成了2就表示当前有两个变量持有这个“new MyClass(10)这个对象”了。
    35. #if 1 //正确写法   
    36.     SAutoRefPtr<MyClass> ptr1;                              
    37.     ptr1.Attach(new MyClass(10));//  因为Attach没有额外调用AddRef。本来 m_cRef(1) 内部的计数m_cRef初始就是1。这样 表示:ptr1 拥有“new MyClass(10)这个对象”
    38. #else // c++ 11 写法
    39.     SAutoRefPtr<MyClass> ptr1;                              
    40.     initAutoRefPtr(ptr1, 10);
    41. #endif
    42.     // 现在ptr1指向一个MyClass对象,其值为10
    43.     std::cout << "Value from ptr1: " << ptr1->GetValue() << std::endl;
    44.    
    45.       // 当ptr1离开作用域时,它所管理的MyClass对象将被自动释放
    46.     {
    47.         // 创建一个新的SAutoRefPtr,并从ptr1复制所有权
    48.         SAutoRefPtr<MyClass> ptr2(ptr1);//这里调用 拷贝构造函数 SAutoRefPtr(const SAutoRefPtr & src)它会调用AddRef。增加m_cRef为2。
    49.                                         //ptr2也 拥有“new MyClass(10)这个对象”

    50.         
    51.         std::cout << "Value from ptr2: " << ptr2->GetValue() << std::endl;
    52.         std::cout << "Value from ptr1: " << ptr1->GetValue() << std::endl;
    53.       
    54.         // 当ptr2离开作用域时,
    55.         //调用         ~SAutoRefPtr() ->Release().m_cRef减1后为1;
    56.     }

    57.     std::cout << "Value from ptr1: " << ptr1->GetValue() << std::endl;
    58.     // 当ptr1离开作用域时,
    59.     //调用         ~SAutoRefPtr() ->Release().m_cRef减1后为0;查看TObjRefImpl的Release ,它会delete this。这时候new MyClass(10)就会被delete
    60.     return 0;
    61. }
    复制代码
    那里不对的,请指正,感谢。
  • TA的每日心情
    开心
    2025-6-8 10:03
  • 签到天数: 58 天

    [LV.5]常住居民I

    69

    主题

    12

    回帖

    1605

    积分

    管理员

    积分
    1605
    发表于 2024-11-11 09:06:46 | 显示全部楼层
    谢谢楼主分享
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2025-6-24 07:25 , Processed in 0.053240 second(s), 20 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表