TA的每日心情 | 郁闷 2024-11-7 21:23 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
新手上路
- 积分
- 46
|
看了老大的教程。https://www.cnblogs.com/setoutsoft/p/11693747.html
- bool SDemoSkin::SetImage(SStringW imgfile)
- {
- m_bIsColor = false;
- m_FilePath = imgfile;
- IBitmap *image = LOADIMAGE2(L"file:" + imgfile);
- if (image)
- {
- SetImage(image);
- //image->Release();
- return true;
- }
- return false;
- }
复制代码
比如以上的代码,云里雾里。花点时间,学习下。只给新手看的。高手就绕路吧,哈哈。写了一个demo验证一下。
- // autoRef_test.cpp : This file contains the 'main' function. Program execution begins and ends there.
- //
- #include <iostream>
- #include <type_traits>
- #include <interface\obj-ref-i.h>
- #include <helper/obj-ref-impl.hpp>
- using namespace SOUI;
- class MyClass : public TObjRefImpl<IObjRef> {
- public:
- MyClass(int value) : value_(value) {
- std::cout << "MyClass constructed with value: " << value_ << std::endl;
- }
- ~MyClass() {
- std::cout << "MyClass destructed with value: " << value_ << std::endl;
- }
- int GetValue() const {
- return value_;
- }
- private:
- int value_;
- };
- //c++ 11 new attach
- template <typename T, typename ... Args>
- void initAutoRefPtr(SAutoRefPtr<T>& autoRefPtr, Args && ... args) {
- // 创建新对象
- T* newObj = new T(std::forward<Args>(args)...);
- autoRefPtr.Attach(newObj); // Attach没有额外调用AddRef,这里TObjRefImpl 内部的计数m_cRef初始就是1
- }
- int main()
- {
- //SAutoRefPtr 的作用就是你 new的对象的生命周期可以交给它。自己不用再delete了
-
- //SAutoRefPtr<MyClass> ptr1 = SAutoRefPtr<MyClass>(new MyClass(10));//不能这样写,因为会调用 SAutoRefPtr(T* lp) ,它会调用addRef。
- //但是第一次创建TObjRefImpl的内部计数m_cRef初始为1,如果再调用addRe,
- //m_cRef就会变成了2就表示当前有两个变量持有这个“new MyClass(10)这个对象”了。
- #if 1 //正确写法
- SAutoRefPtr<MyClass> ptr1;
- ptr1.Attach(new MyClass(10));// 因为Attach没有额外调用AddRef。本来 m_cRef(1) 内部的计数m_cRef初始就是1。这样 表示:ptr1 拥有“new MyClass(10)这个对象”
- #else // c++ 11 写法
- SAutoRefPtr<MyClass> ptr1;
- initAutoRefPtr(ptr1, 10);
- #endif
- // 现在ptr1指向一个MyClass对象,其值为10
- std::cout << "Value from ptr1: " << ptr1->GetValue() << std::endl;
-
- // 当ptr1离开作用域时,它所管理的MyClass对象将被自动释放
- {
- // 创建一个新的SAutoRefPtr,并从ptr1复制所有权
- SAutoRefPtr<MyClass> ptr2(ptr1);//这里调用 拷贝构造函数 SAutoRefPtr(const SAutoRefPtr & src)它会调用AddRef。增加m_cRef为2。
- //ptr2也 拥有“new MyClass(10)这个对象”
-
- std::cout << "Value from ptr2: " << ptr2->GetValue() << std::endl;
- std::cout << "Value from ptr1: " << ptr1->GetValue() << std::endl;
-
- // 当ptr2离开作用域时,
- //调用 ~SAutoRefPtr() ->Release().m_cRef减1后为1;
- }
- std::cout << "Value from ptr1: " << ptr1->GetValue() << std::endl;
- // 当ptr1离开作用域时,
- //调用 ~SAutoRefPtr() ->Release().m_cRef减1后为0;查看TObjRefImpl的Release ,它会delete this。这时候new MyClass(10)就会被delete
- return 0;
- }
复制代码 那里不对的,请指正,感谢。
|
|